PL/SQL 开发人员 - 创建动态 SQL

PL/SQL Developer - Creating dynamic SQL

我正在使用 PL/SQL 开发人员。我正在尝试通过 vba 获取 excel 的查询结果。由于查询太长,我决定用查询结果创建 table,然后用 vba 简单地得到 table 结果。为了通过 excel 创建 table,我需要使用动态 sql 创建过程。所以这就是我到目前为止所尝试的(即使这个简单的例子也不起作用):

create or replace procedure d_x IS
 str VARCHAR(81) = 'create table as select 1 as x from dual'
BEGIN
   EXECUTE IMMEDIATE str; 
END;

过程完成且没有错误。但是当我尝试执行它来创建 table 时,它会抛出一个错误。

执行语句:

EXECUTE d_x;

执行语句抛出 'ORA-00900' Invalid sql statement 错误。 我是 pl sql 的新手,所以我找不到解决方案。 如有任何帮助,我们将不胜感激。

您发布的程序无效,因此无法正确执行。修复后,看起来像这样:

SQL> create or replace procedure d_x IS
  2   str VARCHAR(81) := 'create table test as select 1 as x from dual';
  3  BEGIN
  4     EXECUTE IMMEDIATE str;
  5  END;
  6  /

Procedure created.

在支持 execute 的工具中,您可以 运行 作为:

SQL> execute d_x

PL/SQL procedure successfully completed.

SQL> select * from test;

         X
----------
         1

“正确”方式 - 在 任何地方都有效 - 是将它(过程)封装到 begin-end 块中:

SQL> drop table test;

Table dropped.

SQL> begin
  2    d_x;
  3  end;
  4  /

PL/SQL procedure successfully completed.

SQL>

我建议你这样做。

在 PL/SQL Developer 中,您可以单击过程名称并选择 'Test',这将生成一个调用脚本作为测试 window。

您只能在命令 window 中使用 execute,因为它是 SQL*Plus 命令,而不是 SQL 或 PL/SQL 的一部分,命令 window 是一个 SQL*Plus 模拟器。

在 SQL window 中,您可以使用完整的 PL/SQL 块:

begin
    d_x;
end
/

或使用SQL call命令:

call d_x();

请注意,无论过程是否有任何参数,call() 都需要括号。

在 SQL window 中使用 PLSQL 块时,/ 字符可用作分隔符,其中您有多个语句,否则 PL/SQ 开发者将不知道一个在哪里结束,另一个从哪里开始。

一个测试window只能有一个语句并且只允许一个PL/SQL块或SQL语句,所以最后没有/字符.