Oracle 将文件内容作为参数传递给Sql*Plus命令

Oracle 将文件内容作为参数传递给Sql*Plus命令,oracle,sqlplus,Oracle,Sqlplus,我正在尝试编写一个sqlplus命令,该命令从存储在.sql文件中的查询创建一个表 包含查询的特定.sql文件将作为变量(&v_InputQuery)提供给我的sqlplus命令 我试过类似的方法,但不起作用 CREATE TABLE &v_OutputTable AS ( < &v_InputQuery ) ; 创建可输出为的表&v_ (

我正在尝试编写一个sqlplus命令,该命令从存储在.sql文件中的查询创建一个表

包含查询的特定.sql文件将作为变量(
&v_InputQuery
)提供给我的sqlplus命令

我试过类似的方法,但不起作用

CREATE TABLE &v_OutputTable AS
(
< &v_InputQuery
)
;
创建可输出为的表&v_
(
<&v\u输入查询
)
;
我收到一个错误,说缺少SELECT关键字

我真正希望的是
&v_InputQuery
不是用用户指定的文件名替换,而是用文件的实际内容替换。有办法吗


多谢各位

不幸的是,您不能创建SQL*Plus命令,而是要创建一个shell脚本来完成它

假设
my_script.sh
在下面

#you can always complete the user interaction at unix/dos
USER=your_user
PASS=your_pass
DB=your_db
OUTPUT_TABLE=$1;
QUERY_FILE=$2;
SELECT_QUERY=`cat $QUERY_FILE`;

sqlplus -S ${USER}/${PASS}@${DB} << !
SET SERVEROUTPUT ON;
VAR EXITCODE NUMBER;

BEGIN
   EXECUTE IMMEDIATE ' CREATE TABLE $OUTPUT_TABLE AS $SELECT_QUERY ';
   :EXITCODE := SQLCODE;
EXCEPTION
WHEN OTHERS THEN
   DBMS_OUTPUT.PUT_LINE(SQLERRM);
   :EXITCODE := SQLCODE;
END;
/

exit :EXITCODE
!

是的,你能做到。如果查询位于名为
v\u InputQuery.sql
的文件中,则可以执行以下操作:

CREATE TABLE &v_OutputTable AS (
@v_InputQuery.sql
) ;

重要的是,
@
是行中的第一个字符。SQL*Plus将读取文件并将其内容放在该位置。因此,请确保文件中没有任何终止字符,例如
/
扩展注释,@MaheswaranRavisankar的方法可以工作,但不需要动态SQL(即
立即执行
),因此也不需要匿名块。它可以简化为:

USER=your_user
PASS=your_pass
DB=your_db
OUTPUT_TABLE=$1;
QUERY_FILE=$2;
SELECT_QUERY=`cat $QUERY_FILE`;

sqlplus -S ${USER}/${PASS}@${DB} << !
WHENEVER SQLERROR EXIT FAILURE
CREATE TABLE $OUTPUT_TABLE AS $SELECT_QUERY
!
USER=您的用户
通行证
DB=你的_DB
输出_表=$1;
查询文件=$2;
选择_QUERY=`cat$QUERY_FILE`;

sqlplus-S${USER}/${PASS}@${DB}文件(名称)是否必须直接提供给SQL*Plus,或者是否可以使用中间shell脚本(如果您在Windows上,则可以使用批处理文件)?@Alex Poole我是UNIX环境的新手,因此我不熟悉shell脚本。我只是为了方便自己而设置它,这样我就不必不断地进入底层查询并用createtable将它们包装起来……如图所示。非常感谢。我还没有任何使用shell脚本的经验,但我期待着尝试一下。为什么要使用动态SQL?我不确定它添加了什么,因为语句是动态生成的。@AlexPoole我刚刚编辑添加了用户/密码变量,它运行得非常好,正如上面所说的。有N种方法,可以打印DDL并手动运行,也可以直接打印变量。unix脚本中的$XX将被视为unix变量!!因为它使用
解释器
<代码>立即执行
,阅读脚本有一定意义@MaheswaranRavisankar-我并不是说它不起作用,只是询问了
executeimmediate
在使用
create
命令的基础上增加了什么。由于语句在以任何一种方式解析时都已完全形成,因此就SQL而言,没有动态元素。我添加了一个单独的答案来说明我的意思——我想我们可以在评论中兜圈子@亚历克斯普尔:没问题,我现在正忙于一个iPad项目,没法花这么多钱。。你太棒了!毕竟,每个解决方案都是好的!取决于旁观者。。Njoy:)非常感谢。我会尽快试试这个。我认为其中一个挑战可能是,我实际上希望文件名的形式是一个变量,该变量可以根据用户的输入采用不同的值。@Steve-您可以将
@v\u InputQuery.sql
替换为保存文件名的变量,例如
@&v\u InputQuery
;这就是你的意思吗?(我不认为括号是必要的,也没有添加任何内容-尽管它们不会造成伤害,除非您的查询文件已经有一个终止的
/
?)@Jeffrey Kemp-当我从.sql文件中的查询中删除终端分号时,我能够让您的方法起作用。非常感谢您的建议。抱歉@Steve,我认为这是显而易见的(因为文件的内容被逐字插入到该位置),但我会将其添加到我的答案中。正如我所提到的,我对shell脚本还不熟悉,所以这花费了我比应该花费的时间更长的时间。不过,最终,它还是完美地发挥了作用。非常感谢您的回答和详细的解释。
USER=your_user
PASS=your_pass
DB=your_db
OUTPUT_TABLE=$1;
QUERY_FILE=$2;
SELECT_QUERY=`cat $QUERY_FILE`;

sqlplus -S ${USER}/${PASS}@${DB} << !
WHENEVER SQLERROR EXIT FAILURE
CREATE TABLE $OUTPUT_TABLE AS $SELECT_QUERY
!