动态更改SQL中的where条件

时间:2014-08-07 08:15:36

标签: sql dynamic plsql build-automation

我想根据存储在另一个表中的条件从一个表中检索记录。目前,我在该表中存储了应用于它们的列名和约束。我使用游标逐个获取它们并应用于我的查询。

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

但它没有按预期工作。有没有办法修改这个或任何其他方式,我可以实现这一点。提前谢谢!

2 个答案:

答案 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语句执行。试一试。

分享并享受。