比方我有个表A(A,B,C), 字符串 '1|2|3'规则的。我想把取出然后放入A表:使A表中生成1 2 3 数据:我写了一段过程,编译时候有误,因为我对pl/sql表不是很了解,也许方法不是很对:
CREATE OR REPLACE PACKAGE PKC_UTL_TEST IS -- Author : ADMINISTRATOR
-- Created : 2011-12-6 16:10:26
-- Purpose : TYPE TYP_TAB_A IS TABLE OF A%ROWTYPE INDEX BY BINARY_INTEGER; PROCEDURE PRC_GET_A(TEXT IN VARCHAR2,
PRM_APPCODE OUT NUMBER,
PRM_ERRMSG OUT VARCHAR2);END PKC_UTL_TEST;CREATE OR REPLACE PACKAGE BODY PKC_UTL_TEST IS PROCEDURE PRC_GET_A(TEXT IN VARCHAR2,
PRM_APPCODE OUT NUMBER,
PRM_ERRMSG OUT VARCHAR2) IS
TAB_A TYP_TAB_A;
V_TEXT VARCHAR2(1000); --测试
TEMP_STR VARCHAR2(30) := '';
V_SPLIT VARCHAR(5) := '|';
INDEXS INTEGER;
v_count NUMBER(3);
CURSOR cur_a_column IS
SELECT column_name FROM SYS.USER_TAB_COLUMNS
WHERE 1 = 1
AND TABLE_NAME = 'A';
v_sql VARCHAR2(100);
v_a VARCHAR2(20);
v_i NUMBER(1);
BEGIN
--查询表中有多少字段
BEGIN
SELECT COUNT(1)
INTO V_COUNT
FROM SYS.USER_TAB_COLUMNS
WHERE 1 = 1
AND TABLE_NAME = 'A';
EXCEPTION WHEN OTHERS
THEN
PRM_APPCODE := -1;
PRM_ERRMSG := TRIM(Sqlerrm);
END;
V_TEXT := '1|2|3|';
--规则数据截取出来的字段和数据库表中字段一致
FOR rec_a_column IN cur_a_column LOOP
--初始化
INDEXS := INSTR(V_TEXT, V_SPLIT);
INDEXS := INDEXS - 1;
TEMP_STR := SUBSTR(V_TEXT, 1, INDEXS);
INDEXS := INDEXS + 1;
V_TEXT := SUBSTR(V_TEXT, INDEXS + 1);
v_a := rec_a_column.column_name;
TAB_A(1).v_a:= TEMP_STR; END LOOP;
INSERT INTO A VALUES TAB_A(1) ;
EXCEPTION
WHEN OTHERS THEN
PRM_APPCODE := -1;
PRM_ERRMSG := TRIM(SQLERRM);
END;
END PKC_UTL_TEST;
CREATE OR REPLACE PACKAGE PKC_UTL_TEST IS -- Author : ADMINISTRATOR
-- Created : 2011-12-6 16:10:26
-- Purpose : TYPE TYP_TAB_A IS TABLE OF A%ROWTYPE INDEX BY BINARY_INTEGER; PROCEDURE PRC_GET_A(TEXT IN VARCHAR2,
PRM_APPCODE OUT NUMBER,
PRM_ERRMSG OUT VARCHAR2);END PKC_UTL_TEST;CREATE OR REPLACE PACKAGE BODY PKC_UTL_TEST IS PROCEDURE PRC_GET_A(TEXT IN VARCHAR2,
PRM_APPCODE OUT NUMBER,
PRM_ERRMSG OUT VARCHAR2) IS
TAB_A TYP_TAB_A;
V_TEXT VARCHAR2(1000); --测试
TEMP_STR VARCHAR2(30) := '';
V_SPLIT VARCHAR(5) := '|';
INDEXS INTEGER;
v_count NUMBER(3);
CURSOR cur_a_column IS
SELECT column_name FROM SYS.USER_TAB_COLUMNS
WHERE 1 = 1
AND TABLE_NAME = 'A';
v_sql VARCHAR2(100);
v_a VARCHAR2(20);
v_i NUMBER(1);
BEGIN
--查询表中有多少字段
BEGIN
SELECT COUNT(1)
INTO V_COUNT
FROM SYS.USER_TAB_COLUMNS
WHERE 1 = 1
AND TABLE_NAME = 'A';
EXCEPTION WHEN OTHERS
THEN
PRM_APPCODE := -1;
PRM_ERRMSG := TRIM(Sqlerrm);
END;
V_TEXT := '1|2|3|';
--规则数据截取出来的字段和数据库表中字段一致
FOR rec_a_column IN cur_a_column LOOP
--初始化
INDEXS := INSTR(V_TEXT, V_SPLIT);
INDEXS := INDEXS - 1;
TEMP_STR := SUBSTR(V_TEXT, 1, INDEXS);
INDEXS := INDEXS + 1;
V_TEXT := SUBSTR(V_TEXT, INDEXS + 1);
v_a := rec_a_column.column_name;
TAB_A(1).v_a:= TEMP_STR; END LOOP;
INSERT INTO A VALUES TAB_A(1) ;
EXCEPTION
WHEN OTHERS THEN
PRM_APPCODE := -1;
PRM_ERRMSG := TRIM(SQLERRM);
END;
END PKC_UTL_TEST;
而且,'1|2|3'可以这样分隔:
select regexp_substr('1|2|3', '[^|]', 1, level) from dual
connect by level < =3;
嗯,是个方法,其实我想用下pl/sql表 就是把字段截取出来 存在pl/sql表里 在插入数据库下面 TAB_A(1).v_a:= TEMP_STR; 的引用有问题,我不知道该如何存取值!