SQLPLUS 脚本调用函数并执行 return 字符串
SQLPLUS script calling a function and executing the return String
我有一个需要调用函数的sqlplus脚本。这个函数动态创建了一个SQL select 并且已经在数据库中编译好了。
我的脚本需要调用此函数,执行 SQL 请求 returns,然后将数据假脱机存储在 CSV 文件中。
我的 SQLPLUS 代码如下:
SET HEAD OFF
SET TRIMOUT ON
SET TRIMSPOOL ON
SET LINESIZE 32000
SET PAGESIZE 0
SET TERMOUT OFF
SET ECHO OFF
SET COLSEP ,
spool /a/b/rvibap/c/&1..csv
EXECUTE IMMEDIATE build_select(&1)
spool off;
/
但是,我的 CSV 文件中出现以下错误:
BEGIN IMMEDIATE build_select(TYPE); END;
*
ERROR at line 1:
ORA-06550: line 1, column 17:
PLS-00103: Encountered the symbol "BUILD_SELECT" when expecting one of the following:
:= . ( @ % ;
The symbol ":=" was substituted for "BUILD_SELECT" to continue.
我按以下方式调用我的 SQL 脚本:
@test.sql TYPE
我也测试了build_select函数,它运行正常; return 字符串中的查询。
语法错误...也许您可以调用刚刚创建的假脱机?
以下是可行的方法:
SET HEAD OFF
SET TRIMOUT ON
SET TRIMSPOOL ON
SET LINESIZE 32000
SET PAGESIZE 0
SET TERMOUT OFF
SET ECHO OFF
SET COLSEP ''
spool /a/b/rvibap/c/&1..sql
prompt SET COLSEP ,
select build_select(&1) from dual;
spool off;
spool /a/b/rvibap/c/&1..csv
@/a/b/rvibap/c/&1
spool off;
希望对您有所帮助。
您的代码几乎没有问题。
- 没有包含您的
EXECUTE IMMEDIATE
的 BEGIN END
块
表达式。
EXECUTE IMMEDIATE
不显示 sql select 语句的结果。
- 您将执行脚本调用为
@test.sql TYPE
,它将被解析为 EXECUTE IMMEDIATE build_select(TYPE)
,即没有引号的普通 TYPE
- 这将引发错误。但是,您可以通过 运行 将其解决为
@test.sql "'TYPE'"
正如我所说,您不能在 11g 及以下版本中直接执行和查看动态 SQL select
语句的结果。因此,您可以使用其他答案中使用的技术,我不清楚它是否整齐地生成 select
SQL。
如果你在 12c
,你可以使用
open a_ref_cursor for build_select(&1);
dbms_sql.return_result(a_ref_cursor);
对于 11g
及以下,这里解释了一些技巧。
How to output result of SELECT statement which is executed using native dynamic SQL?
如果您可以不使用 function
,更好的解决方案是
Generating SQL*Plus script using SQL*Plus
我有一个需要调用函数的sqlplus脚本。这个函数动态创建了一个SQL select 并且已经在数据库中编译好了。 我的脚本需要调用此函数,执行 SQL 请求 returns,然后将数据假脱机存储在 CSV 文件中。 我的 SQLPLUS 代码如下:
SET HEAD OFF
SET TRIMOUT ON
SET TRIMSPOOL ON
SET LINESIZE 32000
SET PAGESIZE 0
SET TERMOUT OFF
SET ECHO OFF
SET COLSEP ,
spool /a/b/rvibap/c/&1..csv
EXECUTE IMMEDIATE build_select(&1)
spool off;
/
但是,我的 CSV 文件中出现以下错误:
BEGIN IMMEDIATE build_select(TYPE); END;
*
ERROR at line 1:
ORA-06550: line 1, column 17:
PLS-00103: Encountered the symbol "BUILD_SELECT" when expecting one of the following:
:= . ( @ % ;
The symbol ":=" was substituted for "BUILD_SELECT" to continue.
我按以下方式调用我的 SQL 脚本:
@test.sql TYPE
我也测试了build_select函数,它运行正常; return 字符串中的查询。
语法错误...也许您可以调用刚刚创建的假脱机?
以下是可行的方法:
SET HEAD OFF
SET TRIMOUT ON
SET TRIMSPOOL ON
SET LINESIZE 32000
SET PAGESIZE 0
SET TERMOUT OFF
SET ECHO OFF
SET COLSEP ''
spool /a/b/rvibap/c/&1..sql
prompt SET COLSEP ,
select build_select(&1) from dual;
spool off;
spool /a/b/rvibap/c/&1..csv
@/a/b/rvibap/c/&1
spool off;
希望对您有所帮助。
您的代码几乎没有问题。
- 没有包含您的
EXECUTE IMMEDIATE
的BEGIN END
块 表达式。 EXECUTE IMMEDIATE
不显示 sql select 语句的结果。- 您将执行脚本调用为
@test.sql TYPE
,它将被解析为EXECUTE IMMEDIATE build_select(TYPE)
,即没有引号的普通TYPE
- 这将引发错误。但是,您可以通过 运行 将其解决为
@test.sql "'TYPE'"
正如我所说,您不能在 11g 及以下版本中直接执行和查看动态 SQL select
语句的结果。因此,您可以使用其他答案中使用的技术,我不清楚它是否整齐地生成 select
SQL。
如果你在 12c
,你可以使用
open a_ref_cursor for build_select(&1);
dbms_sql.return_result(a_ref_cursor);
对于 11g
及以下,这里解释了一些技巧。
How to output result of SELECT statement which is executed using native dynamic SQL?
如果您可以不使用 function
,更好的解决方案是
Generating SQL*Plus script using SQL*Plus