我想根据存储在另一个表中的条件从一个表中检索记录。目前,我在该表中存储了应用于它们的列名和约束。我使用游标逐个获取它们并应用于我的查询。
DECLARE
cursor c_checks
is
select FIELD_NAME,CHECKS from table_checks
BEGIN
for i in c_checks loop
INSERT INTO Results_Table
(SELECT c.*,'wrong product' Error_field FROM My_table c
WHERE i.FIELD_NAME||' '||i.CHECKS);
Exit when c_checks%notfound;
End loop;
END;
table_checks如下:
FIELD_NAME CHECKS
Attribute1 IS NULL
Attribute2 IS NULL
Attribute3 > Attribute2
Attribute4 IS DATE
但它没有按预期工作。有没有办法修改这个或任何其他方式,我可以实现这一点。提前谢谢!
答案 0 :(得分:3)
您需要使用dynamic SQL。它允许您在运行时构造查询。
动态SQL是一种用于生成和运行的编程方法 运行时的SQL语句。在编写通用目的时很有用 在编写程序时,还有灵活的程序,如即席查询系统 必须运行数据库定义语言(DDL)语句,或何时运行 你在编译时不知道SQL语句的全文 或其输入和输出变量的数量或数据类型。
答案 1 :(得分:1)
为了扩展@ RomanKonoval的答案,我将修改你的代码以动态构建语句并执行它:
DECLARE
CURSOR c_checks IS SELECT FIELD_NAME, CHECKS FROM TABLE_CHECKS;
strInsert VARCHAR2(32767);
BEGIN
FOR i IN c_checks LOOP
strInsert := 'INSERT INTO RESULTS_TABLE ' ||
' (SELECT c.*, 'wrong product' Error_field ' ||
'FROM MY_TABLE c ' ||
'WHERE ' || i.FIELD_NAME || ' ' || i.CHECKS || ')';
DBMS_OUTPUT.PUT_LINE('strInsert=' || strInsert);
EXECUTE IMMEDIATE strInsert;
END LOOP;
COMMIT;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('Error: ' || SQLCODE || ' : ' || SQLERRM);
RAISE;
END;
这里INSERT
语句汇编在一个字符串变量中,然后使用EXECUTE IMMEDIATE
语句执行。试一试。
分享并享受。