Stored procedures 游标中%rowtype的动态查询
我需要创建一个记录类型来包含上述查询的结果集Stored procedures 游标中%rowtype的动态查询,stored-procedures,plsql,oracle11g,cursor,oracle-cursor,Stored Procedures,Plsql,Oracle11g,Cursor,Oracle Cursor,我需要创建一个记录类型来包含上述查询的结果集 V_SQL VARCHAR2(200) := 'SELECT T1.'||record_id||',T1.'||card_no||',T2.TEST_CARD_NO, T1.'||type_cc||' FROM '|| table_name||' T1 INNER JOIN TEST T2 ON T2.ID = T1.'||record_id; 这样我就可以在循环执行语句中使用t1
V_SQL VARCHAR2(200) := 'SELECT T1.'||record_id||',T1.'||card_no||',T2.TEST_CARD_NO, T1.'||type_cc||' FROM '|| table_name||' T1
INNER JOIN TEST T2 ON
T2.ID = T1.'||record_id;
这样我就可以在循环执行语句中使用t1 C_BRNGB_EXTRACT%ROWTYPE(加上l_BRNGB_EXTRACT中t2.col4%TYPE的另一列)
CREATE OR REPLACE PROCEDURE "GCCPMAINT"."FUNCTION_CURSOR"(table_name VARCHAR2,record_id VARCHAR2,card_no VARCHAR2,type_cc VARCHAR2)
AS
limit_in NUMBER:=100;
V_SQL VARCHAR2(200) := 'SELECT T1.'||record_id||',T1.'||card_no||',T2.TEST_CARD_NO, T1.'||type_cc||' FROM '|| table_name||' T1
INNER JOIN TEST T2 ON
T2.ID = T1.'||record_id;
TYPE BRNGB_EXTRACT IS REF CURSOR;
C_BRNGB_EXTRACT BRNGB_EXTRACT;
TYPE BRNGB_EXTRACT1 IS TABLE OF C_BRNGB_EXTRACT%ROWTYPE;
l_BRNGB_EXTRACT BRNGB_EXTRACT1;
BEGIN
OPEN C_BRNGB_EXTRACT FOR V_SQL;
LOOP
FETCH C_BRNGB_EXTRACT BULK COLLECT INTO l_BRNGB_EXTRACT LIMIT limit_in;
EXIT WHEN l_BRNGB_EXTRACT.COUNT = 0;
FORALL indx IN 1 .. l_BRNGB_EXTRACT.COUNT
EXECUTE IMMEDIATE 'UPDATE table_name SET CARD_NO=:1 WHERE CARD_NO=:2 AND RECORD_ID=:3' USING l_BRNGB_EXTRACT(indx).test_card_no,l_BRNGB_EXTRACT(indx).CARD_NO,l_BRNGB_EXTRACT(indx).RECORD_ID;
END LOOP;
CLOSE C_BRNGB_EXTRACT;
COMMIT;
END;
对于上面的存储过程,我得到以下错误
PLS-00320:此表达式类型的声明为
PL/SQL不完整或格式错误:忽略项PLS-00597:表达式
INTO列表中的“L_BRNGB_EXTRACT”的类型错误PL/SQL:SQL
语句已忽略PLS-00487:对变量的引用无效
“C_BRNGB_提取%ROWTYPE”
请帮我解决这个问题。我找到了解决办法
TYPE BRNGB_EXTRACT IS REF CURSOR;
C_BRNGB_EXTRACT BRNGB_EXTRACT;
-- TYPE BRNGB_EXTRACT1 IS TABLE OF C_BRNGB_EXTRACT%ROWTYPE;
TYPE BRNGB_EXTRACT1 IS RECORD (
record_id varchar(30),
card_no varchar(30),
TEST_CARD_NO varchar(30)
);
type test_rec_arr is table of BRNGB_EXTRACT1 index by pls_integer;
l_BRNGB_EXTRACT test_rec_arr;
你不能。。。如果这样做,则需要动态声明整个块;如果您真的需要这样做,那么您将不得不使用DBMS_SQL。如果调用过程的次数过多,我建议您不要使用当前的模型,因为每次调用语句时都必须对语句进行硬解析,这可能会大大降低您的速度。@Ben,那么解决方案是什么呢?如果可以的话,解决方案是(可能是)使用普通SQL,而不是动态的。如果必须使用动态SQL,则必须使用
DBMS\u SQL
包。9小时前我没有时间讨论这个问题,现在恐怕也没有,这就是为什么我发表评论而不是写一个完整的答案。