SQL * Plus EXIT <变量>类型

时间:2018-02-14 10:02:49

标签: oracle sqlplus

我有一个运行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

我的问题是我必须声明什么类型的变量才能允许它发回该变量的值。我试过INTNUMBER(2,0) [我的想法是精度小于255,因为我看到必须是1字节的值]。但是每次我调用它时都会出现以下错误

Usage: { EXIT | QUIT }  [ SUCCESS | FAILURE | WARNING | n |
       <variable> | :<bindvariable> ]  [ COMMIT | ROLLBACK ]

我在想我不知何故需要8位数字类型。有什么建议吗?

我的呼叫环境需要2位数的状态代码,这意味着0-255(8位)范围内的值才是完美的。

我的调用环境是C语言中的"system()"函数,当我在脚本中硬编码值时,它可以正常工作,例如EXIT 30EXIT 20,但EXIT myvar宣布myvarintnumeric时,myvar无效,我也尝试初始化{{1}类似于99myvar int := 99)之类的东西,它不起作用。

1 个答案:

答案 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代替。取决于你想要多少控制。