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语句,所以最后没有/
字符.
我正在使用 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语句,所以最后没有/
字符.