Archive for the ‘oracle’ Category
星期五, 十一月 6th, 2009
oracle调用c函数(续)
本来挺简单的问题,可惜我们系统安装的有问题。
oracle是64位的,而gcc是32位的。
这样在调用的过程会报错误。
ERROR at line 1:
ORA-06520: PL/SQL: Error loading external library
ORA-06522: ld.so.1: extproc: fatal:
/opt/oracle/products/10.2.0/lib/sunwg.so: wrong ELF class: ELFCLASS32
ORA-06512: at "ETL.H_EXECUTE_CMD", line 1
重装64位的gcc也是个麻烦事。
从网上查了半天终于发现个好办法。
修改LD_LIBRARY_PATH=/opt/oracle/products/10.2.0/lib为
LD_LIBRARY_PATH=/opt/oracle/products/10.2.0/lib32
这样调用32位的oracle lib库。
重新启动listener。
搞定。
><
Posted in linux and unix, oracle, shell,perl,python,lex,yacc,c | No Comments »
星期五, 十一月 6th, 2009
今天处理同事的问题,顺便学习了从oracle调用c函数的方法。
1,修改listener.ora
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC32))
(ADDRESS = (PROTOCOL = TCP)(HOST =sunwg)(PORT = 1521))
)
)
)
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = /opt/oracle/products/10.2.0)
(PROGRAM = /opt/oracle/products/10.2.0/bin/extproc)
)
(SID_DESC =
(SID_NAME = sunwg)
(ORACLE_HOME = /opt/oracle/products/10.2.0)
(GLOBAL_DBNAME ...
Posted in oracle, shell,perl,python,lex,yacc,c | No Comments »
星期二, 十月 13th, 2009
今天碰到个需求,解析ORACLE数据库中存储的xml文件。
这个xml的信息作为一个varchar2的字段存储在表中。
所以要使用xml的一些特性就首先需要将varchar2类型转换成xmltype。
在测试过程中又碰到了烦人的字符集问题。
举例如下:
sunwg@sunwg> create table sunwg(xml_1 xmltype);
Table created.
sunwg@sunwg> desc sunwg
Name Null? Type
-------------------------- -------- -------------------------
XML_1 XMLTYPE
创建了张有XMLTYPE字段的表sunwg。
现在向其中插入xml记录。
sunwg@sunwg> insert into sunwg values(
2 xmltype('<?xml version="1.0" encoding="gb2312" ?>
3 <FEATURELIST>
4 <FEATURE id="62923" name="TOM" />
5 <FEATURE id="62924" name="MARY" />
6 </FEATURELIST>'));
1 row created.
sunwg@sunwg> commit;
Commit complete.
sunwg@sunwg> select * from sunwg;
XML_1
----------------------------------------------------------------------------------------------------
<?xml version="1.0" encoding="gb2312" ?>
<FEATURELIST>
<FEATURE id="62923" name="TOM" ...
Posted in oracle | No Comments »
星期二, 九月 1st, 2009
查询PLSQL或VIEW中的倚赖对象
SELECT r3.owner,r3.object_name procedure_name,r3.object_type,
r1.ORDER# seq,
(SELECT owner FROM dba_objects WHERE object_id = ...
Posted in oracle | No Comments »
星期二, 九月 1st, 2009
SQL/PLSQL的解析一直是个令我们很头痛的事情。
对于单个SQL的解析原来一直没什么好的方法。
对于PLSQL原来常用的方法是从ORACLE的视图sys.dependency$和sys.access$中查询,
这种方法虽然比较简单,但是存在一个比较严重的缺陷——分析粒度太粗,
sys.dependency$和sys.access$这两个视图是为了保证存储过程的有效性而存在的,所以基础单位是存储过程。
也就是说通过这两个视图你可以知道PLSQL中SELECT一些表,UPDATE一些表,但你无法知道这些被查询的表和被更新的表之间的关系。
那么这些无法建立联系的,无法进行关联的离散的表对我们分析PLSQL,进行ETL的血缘分析几乎没有意义。
经过二周的程序设计和代码开发,ORACLE SQL/PLSQL文本解析程序SQL_PARSE V2.0诞生了。
下面首先介绍SQL_PARSE的实现原理,然后介绍使用SQL_PARSE分析SQL/PLSQL的示例。
一,SQL_PARSE实现原理
SQL_PARSE是用C语言基于编译原理开发的SQL/PLSQL文本解析程序。SQL_PARSE由SQL_PARSE主程序和关键字参数文本KEY_FILE.TXT组成。
主程序是整个SQL_PARSE的核心,KEY_FILE.TXT文件存储的是ORACLE中的常见关键字及其特定标识代码。
SQL_PARSE的主程序主要由四部分组成:字符识别,词法分析,语法分析,语义分析。
字符识别:识别输入的字符类型,字母,数字,标点符号
词法分析:根据字符识别的结果将多个字符进程合并归类,分析出字符串,关键字,数字,注释等有意义的单元
语法分析:根据ORACLE中的SQL语法,将词法分析的产出物进行识别,分析出列,表,用户名,操作类型,数据链等
语义分析:识别出游标,select into,并将识别结果同变量建立对应关系,得出更加精确的结果
目前SQL_PARSE V2.0可以分析出任意层次的SQL(SELECT,INSERT,DELETE,UPDATE,MERGE)和复杂的PLSQL语句。但是其中语义分析部分还是很弱。
语义分析也是未来SQL_PARSE V3.0主要需要完善和发展的部分。
通过一个小例子解释下各个部分的功能和整个程序的处理过程
select col1,(select col2 from tab2),101 from tab1 where col3='aaa';
字符识别:通过字符的ascii码,将字符分类。s,e,l,e,c,t这样的识别为字母,1,0,1识别为数字,{}识别为括号
词法分析:根据各个单元的定义将字符分组;字符标识为字母开头的由字母,数字或者下划线组成的字符串,select就被识别为字符标识;
语法分析:根据SQL的语法构成进行类型划分,select语句为查询的开始标识符,接下来就查询的列,接着是from关键字,然后查询表等等。
语义分析:判断col1,col2这样的标识到底是表中的字段还是程序中的变量。
二,SQL_PARSE分析SQL/PLSQL的示例
例子1:分析PLSQL--p_cn_loan_loanerscore_fatdt1
oracle:~/sunwg>./sql_parse p_cn_loan_loanerscore_fatdt1.sql
procedure name statement:etl.p_cn_loan_loanerscore_fatdt1
statement 0:select
select table:cnpub.cn_loan_mon_times_dimt0
statement 1:delete
delete table:cndss.cn_loan_loanerscore_fatdt1
statement 2:select
select table:dual
statement 3:insert
insert table:cndss.cn_loan_loanerscore_fatdt1
select table:cnpub.cn_loan_item_dimt0
select table:cndss.cn_loan_item_sumdt1
select table:cnpub.cn_loan_item_dimt0
select table:cndss.cn_loan_item_sumdt1
select table:cnpub.cn_loan_item_dimt0
statement 4:insert
insert table:cndss.cn_loan_loanerscore_fatdt1
select ...
Posted in oracle, shell,perl,python,lex,yacc,c | No Comments »