流配置异常(ORA-01403)的完整解决过(一):http://yangtingkun.itpub.net/post/468/102138
流配置异常(ORA-01403)的完整解决过(二): http://yangtingkun.itpub.net/post/468/103639
由于利用Oracle给出的过程没法办法找到问题的原因。因此只能另外想办法。
首先是考虑将得到的数据放到一个表中,因为通过SQL处理表中的数据是轻而易举的。其次是格式化得到的结构,最好将其转化为可以执行的SQL语句,因为这样更有利于找到问题所在。
于是我修改了Oracle提供的三个过程,将LCR中的数据变成执行的SQL语句,并将结果写到我建好的表中。代码如下:
SQL> CREATE SEQUENCE SEQ_MY_REC;
序列已创建。
SQL> CREATE TABLE MY_RECORDS (ID NUMBER, STATMENTS VARCHAR2(4000));
表已创建。
这个表用来保存解析处理的SQL语句。
SQL> CREATE OR REPLACE PROCEDURE MY_PRINT_ANY(P_DATA IN SYS.ANYDATA, P_STR IN OUT VARCHAR2, P_FLAG I
N OUT NUMBER) IS
2 V_TN VARCHAR2(61);
3 V_STR VARCHAR2(4000);
4 V_CHR CHAR(2000);
5 V_NUM NUMBER;
6 V_DAT DATE;
7 V_RW RAW(4000);
8 V_RES NUMBER;
9 BEGIN
10 V_TN := P_DATA.GETTYPENAME();
11 P_FLAG := 0;
12 IF V_TN = 'SYS.VARCHAR2' THEN
13 V_RES := P_DATA.GETVARCHAR2(V_STR);
14 IF V_STR IS NOT NULL THEN
15 P_STR := P_STR || '''' || V_STR || '''';
16 ELSE
17 P_STR := P_STR || ' NULL ';
18 P_FLAG := 1;
19 END IF;
20 ELSIF V_TN = 'SYS.CHAR' THEN
21 V_RES := P_DATA.GETCHAR(V_CHR);
22 IF V_CHR IS NOT NULL THEN
23 P_STR := P_STR || '''' || RTRIM(V_CHR) || '''';
24 ELSE
25 P_STR := P_STR || ' NULL ';
26 P_FLAG := 1;
27 END IF;
28 ELSIF V_TN = 'SYS.NUMBER' THEN
29 V_RES := P_DATA.GETNUMBER(V_NUM);
30 IF V_NUM IS NOT NULL THEN
31 P_STR := P_STR || V_NUM;
32 ELSE
33 P_STR := P_STR || ' NULL ';
34 P_FLAG := 1;
35 END IF;
36 ELSIF V_TN = 'SYS.DATE' THEN
37 V_RES := P_DATA.GETDATE(V_DAT);
38 IF V_DAT IS NOT NULL THEN
39 P_STR := P_STR || '''' || V_DAT || '''';
40 ELSE
41 P_STR := P_STR || ' NULL ';
42 P_FLAG := 1;
43 END IF;
44 ELSIF V_TN = 'SYS.VARCHAR' THEN
45 V_RES := P_DATA.GETVARCHAR(V_STR);
46 IF V_STR IS NOT NULL THEN
47 P_STR := P_STR || '''' || V_STR || '''';
48 ELSE
49 P_STR := P_STR || ' NULL ';
50 P_FLAG := 1;
51 END IF;
52 ELSIF V_TN = 'SYS.RAW' THEN
53 V_RES := P_DATA.GETRAW(V_RW);
54 IF V_RW IS NOT NULL THEN
55 P_STR := P_STR || '''' || V_RW || '''';
56 ELSE
57 P_STR := P_STR || ' NULL ';
58 P_FLAG := 1;
59 END IF;
60 ELSE
61 DBMS_OUTPUT.PUT_LINE('TYPENAME IS ' || V_TN);
62 END IF;
63 END;
64 /
www.ixdba.net
过程已创建。
这个过程用来转化各种类型的数据,并将数据写到输入的字符串后面。
SQL> CREATE OR REPLACE PROCEDURE MY_PRINT_LCR(P_LCR IN SYS.ANYDATA) IS
2 V_TYPENM VARCHAR2(61);
3 V_ROWLCR SYS.LCR$_ROW_RECORD;
4 V_RES NUMBER;
5 V_NEWLIST SYS.LCR$_ROW_LIST;
6 V_OLDLIST SYS.LCR$_ROW_LIST;
7 V_INSERT_STR VARCHAR2(4000);
8 V_FLAG NUMBER DEFAULT 0;
9 V_COUNT NUMBER;
10 BEGIN
11 V_TYPENM := P_LCR.GETTYPENAME();
12 IF (V_TYPENM = 'SYS.LCR$_ROW_RECORD') THEN
13 V_RES := P_LCR.GETOBJECT(V_ROWLCR);
14 IF V_ROWLCR.GET_COMMAND_TYPE = 'DELETE' THEN
15 V_INSERT_STR := 'DELETE ' || V_ROWLCR.GET_OBJECT_OWNER || '.' || V_ROWLCR.GET_OBJECT_NAME ||