【发布时间】:2015-04-05 05:50:24
【问题描述】:
我需要创建一个记录类型来包含上述查询的结果集
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_EXTRACT%ROWTYPE'
请帮我解决这个问题。
【问题讨论】:
-
你不能......如果你这样做,你需要动态声明整个块;如果您真的需要这样做,那么您将不得不使用 DBMS_SQL。如果您多次调用该过程,我建议您不要使用当前模型,因为您每次调用时都必须对语句进行硬解析,这可能会显着减慢您的操作速度。
-
@Ben 那么解决方案是什么
-
解决方案是(可能)尽可能使用普通 SQL,而不是动态的。如果您必须使用动态 SQL,您将不得不使用
DBMS_SQL包。我只是在 9 小时前没有时间进入该解决方案,而且我现在也没有时间,我很害怕,这就是我发表评论而不是写出完整答案的原因。
标签: stored-procedures plsql oracle11g cursor oracle-cursor