【问题标题】:Execute the SQL statements from table within an Oracle SQL procedure从 Oracle SQL 过程中的表执行 SQL 语句
【发布时间】:2016-04-26 20:26:14
【问题描述】:

我是 PL/SQL 的新手,我正在努力解决以下问题。我找了 4 小时的答案,但仍然无法正常工作......

我在一个带有 SQL 语句的表中有超过 300 条记录,我的目标是编写一个能够在某些条件下循环它们的过程。 我还想检查哪些查询通过,哪些查询失败。

所以它是这样的(步骤/伪代码列表):

  • 条件作为参数的过程或函数
  • 遍历匹配条件的记录
  • 执行符合匹配的 SQL 语句
  • 给出执行成功或失败的信息

我试图做这样的事情(如下),但我认为这是不正确的 - 因为我没有循环记录。

DECLARE
   sql_stmt    VARCHAR2(3000);

BEGIN
   sql_stmt := 'SELECT testcase_sql
                FROM data_audit_testcase_v2
                WHERE testcase_desc LIKE ''Test 6 - EM%''';
   dbms_output.put_line('Sth: ' || sql_stmt);
   EXECUTE IMMEDIATE sql_stmt ;
END;

我正在考虑根据我的问题调整此代码:

FOR q IN (SELECT sql_text FROM query_table)
LOOP
  EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM (' || q.sql_text || ')'
     INTO some_local_variable;
  <<do something with the local variable>>
END LOOP;

source here

你们觉得呢?

提前感谢您的帮助,

亚瑟

【问题讨论】:

    标签: sql oracle plsql


    【解决方案1】:

    你必须这样做:

    DECLARE
       sql_stmt    VARCHAR2(3000);
        cur SYS_REFCURSOR;
        some_local_variable data_audit_testcase_v2.testcase_sql%TYPE;
    BEGIN
       sql_stmt := 'SELECT testcase_sql
                    FROM data_audit_testcase_v2
                    WHERE testcase_desc LIKE :val';
       DBMS_OUTPUT.PUT_LINE('Sth: ' || sql_stmt);
        OPEN cur FOR sql_stmt USING 'Test 6 - EM%';
        LOOP
            FETCH cur INTO some_local_variable;     
            EXIT WHEN cur%NOTFOUND;
            <<do something with the local variable>>
        END LOOP;
        CLOSE cur;
    END;
    

    【讨论】:

    • 感谢@Wernfried 的贡献。但我仍然无法检查查询是否已执行。我尝试添加诸如DMBS_OUTPUT.PUT_LINE(cur); 之类的内容以查看循环的当前步骤中的内容,但它不会在没有警告的情况下编译并且对我不起作用。我可以请你帮忙吗?
    • 制作DMBS_OUTPUT.PUT_LINE(some_local_variable);
    • FETCH cur INTO some_local_varbiable; 行中出现错误:Inconsistent datatypes: expected %s got %s(它是 ORA-06512)。我正在尝试找出问题所在。
    • 看来PUT_LINE 既不能打印some_local_varbiale 也不能打印cur
    • 我找到了解决方案 - 我在 SELECT 中添加了第二个参数,所以 PUT_LINE 不知道如何显示它:)。
    【解决方案2】:

    我找到了解决方案 - 我在 SELECT 中添加了第二个参数,所以 PUT_LINE 不知道如何显示它:)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-04-08
      • 2019-02-05
      • 2011-06-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-04
      相关资源
      最近更新 更多