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

我的问题是我必须声明什么类型的变量才能允许它发回该变量的值。我试过 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,但是当我将 myvar 声明为 intnumeric 时,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。取决于你想要多少控制权。