在Oracle SQL过程中执行表中的SQL语句

时间:2015-02-25 13:36:02

标签: sql oracle plsql

我是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

你们有什么想法?

提前感谢您的帮助,

亚瑟

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分:0)

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