SQL*加上EXIT <variable>类型
SQL*Plus EXIT <variable> type
我有一个通过 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
,但是当我将 myvar
声明为 int
或 numeric
时,EXIT myvar
不起作用,我还尝试初始化 [=21] =] 到 99
(myvar int := 99
) 之类的东西,它不起作用。
您可以使用 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 显示允许的退出值。
如果我创建一个虚拟 table(使用有效标识符)并添加索引为 1 和代码 42 的行,将其作为脚本从 shell 调用并使用 $?
查看 return 代码(与您的 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
您还可以 select 直接进入绑定变量,这不是直接相关的,但如果您不将其用于其他任何事情,则可以为您节省一个步骤和一个局部变量。您也不需要 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
。取决于你想要多少控制权。
我有一个通过 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
,但是当我将 myvar
声明为 int
或 numeric
时,EXIT myvar
不起作用,我还尝试初始化 [=21] =] 到 99
(myvar int := 99
) 之类的东西,它不起作用。
您可以使用 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 显示允许的退出值。
如果我创建一个虚拟 table(使用有效标识符)并添加索引为 1 和代码 42 的行,将其作为脚本从 shell 调用并使用 $?
查看 return 代码(与您的 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
您还可以 select 直接进入绑定变量,这不是直接相关的,但如果您不将其用于其他任何事情,则可以为您节省一个步骤和一个局部变量。您也不需要 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
。取决于你想要多少控制权。