我有一个运行SQL * Plus的基本脚本,我希望通过EXIT <variable>
将状态代码传递回调用环境。
DECLARE
id varchar2(30) := &1 ;
status varchar(3);
myvar int := 99 ;
BEGIN
SELECT code INTO status
FROM table WHERE index = id;
myvar := TO_NUMBER(status);
dbms_output.put_line(status); -- this works and shows the value I want to see as expected
COMMIT;
END;
/
EXIT myvar
我的问题是我必须声明什么类型的变量才能允许它发回该变量的值。我试过INT
,NUMBER(2,0)
[我的想法是精度小于255,因为我看到必须是1字节的值]。但是每次我调用它时都会出现以下错误
Usage: { EXIT | QUIT } [ SUCCESS | FAILURE | WARNING | n |
<variable> | :<bindvariable> ] [ COMMIT | ROLLBACK ]
我在想我不知何故需要8位数字类型。有什么建议吗?
我的呼叫环境需要2位数的状态代码,这意味着0-255(8位)范围内的值才是完美的。
我的调用环境是C语言中的"system()"
函数,当我在脚本中硬编码值时,它可以正常工作,例如EXIT 30
或EXIT 20
,但EXIT myvar
宣布myvar
为int
或numeric
时,myvar
无效,我也尝试初始化{{1}类似于99
(myvar int := 99
)之类的东西,它不起作用。
答案 0 :(得分:1)
您可以使用a bind variable:
-- declare as SQL*Plus bind variable
variable myvar number;
-- initialise if relevant; could be done inside your PL/SQL block too
exec :myvar := 99;
DECLARE
id varchar2(30) := &1;
status varchar(3);
BEGIN
SELECT code INTO status
FROM your_table
WHERE your_index = id;
-- use bind variable, note the leading colon
:myvar := TO_NUMBER(status);
END;
/
-- exit using the bind variable, again note the leading colon
EXIT :myvar
The SQL*Plus documentation显示允许的退出值。
如果我创建一个虚拟表(使用有效标识符)并添加索引为1和代码42的行,则将其作为脚本从shell调用并使用$?
查看返回代码(与您的相同) system()
调用会得到):
$ sqlplus -l -s usr/pwd@db @your_script 1
old 2: id varchar2(30) := &1 ;
new 2: id varchar2(30) := 1 ;
PL/SQL procedure successfully completed.
$ echo $?
42
您也可以直接选择绑定变量,该变量不是直接相关的,但如果您不使用其他任何内容,则可以保存步骤和局部变量。您也不需要id
变量,因为您可以直接在查询中使用&1
(尽管有时这样做也很有用),所以对于您可能简化的示例,您可以做:
variable myvar number;
BEGIN
SELECT TO_NUMBER(code)
INTO :myvar
FROM your_table
WHERE your_index = &1;
END;
/
EXIT :myvar
如果您在脚本中根本不需要使用PL / SQL,您也可以直接通过column ... new_value ...
语法使用查询结果;这为您提供了用法和文档中引用的变量(而不是绑定变量)选项。:
define myvar = 99
column status new_value myvar
SELECT TO_NUMBER(code) AS status
FROM your_table
WHERE your_index = &1;
EXIT myvar
注意在exit
命令中使用它时没有冒号或确实没有符号。如果发生错误,define
只需提供该代码;您可以使用whenever sqlerror exit 99
代替。取决于你想要多少控制。