【问题标题】:dynamically change the where conditions in SQL动态改变 SQL 中的 where 条件
【发布时间】:2014-09-30 09:27:04
【问题描述】:

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

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

但它没有按预期工作。有什么方法可以修改这个或我可以实现的任何其他方式。提前致谢!

【问题讨论】:

    标签: sql dynamic plsql build-automation


    【解决方案1】:

    您需要使用dynamic SQL。它允许您在运行时构造查询。

    动态 SQL 是一种用于生成和运行的编程方法 运行时的 SQL 语句。写通用的时候很有用 和灵活的程序,如临时查询系统,在编写程序时 必须运行数据库定义语言 (DDL) 语句,或者当 您在编译时不知道 SQL 语句的全文 或其输入和输出变量的数量或数据类型。

    【讨论】:

    • 我尝试了另一种方法,将语句插入到检查表中的字符串中,并以 exec(string_query) 的方式执行,仍然没有
    • 那么您需要更新您的问题并描述您尝试过的内容以及无效的内容。 “没什么”——太模糊了
    • 实际上,我正在使用 Toad for oracle 并且它无法识别语句 "@squery varchar(200)" 中的 "@" 。所以,它不让我开始。
    【解决方案2】:

    为了扩展@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 语句执行。试试这个。

    分享和享受。

    【讨论】:

    • 哇,前段时间我也写了几乎类似的代码。已经完成了。非常感谢你们俩。
    猜你喜欢
    • 2020-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-12
    • 1970-01-01
    • 2013-10-06
    相关资源
    最近更新 更多