在 PL/SQL 过程中获取用户的输入
Get input from user in PL/SQL procedure
我正在构建一个程序,需要从用户那里获得输入以打印一些细节。但是当我使用 & 获取值时,它会因错误而失败。逻辑如下..
DBMS_OUTPUT.PUT_LINE('Enter Y to display Unauthorized records OR N to skip the display');
--SELECT &1 INTO lv_choice FROM DUAL;
IF NOT ('&lv_choice'='Y') THEN
DBMS_OUTPUT.PUT_LINE ('RECORDS WILL NOT BE DISPLAYED');
ELSE
DBMS_OUTPUT.PUT_LINE ('RECORDS TO BE DISPLAYED ARE:');
......
我曾尝试将 &1 用于双重或直接调用 &lv_choice,但因 PLSQL 内部错误而失败。
是否有任何方法可以从用户那里获取输入以进一步执行该过程?
这在 PL/SQL 中是不可能的 - PL/SQL 无法访问终端(除非你在 运行 程序之前做一些事情 like plug in Java or call your program from a something like SQL*Plus(in which you can use commands like ACCEPT/PROMPT .
&
变量是替代变量,特定于SQL*Plus,而不是PL/SQL
如果您正在使用某些 UI 终端,例如 SQLDeveloper 或 TOAD,您可以使用以下代码实现它:
CREATE OR REPLACE INPUTPROCEDURE (LV_CHOICE IN VARCHAR2)
AS
BEGIN
DBMS_OUTPUT.PUT_LINE('Enter Y to display Unauthorized records OR N to skip the display');
--SELECT &1 INTO lv_choice FROM DUAL;
IF lv_choice <> 'Y' THEN
DBMS_OUTPUT.PUT_LINE ('RECORDS WILL NOT BE DISPLAYED');
ELSE
DBMS_OUTPUT.PUT_LINE ('RECORDS TO BE DISPLAYED ARE:');
END INPUTPROCEDURE;
然后像下面这样调用上面的过程:
DECLARE
dyn_stmt VARCHAR2(200);
b BOOLEAN := TRUE;
BEGIN
dyn_stmt := 'BEGIN INPUTPROCEDURE(:LV_CHOICE); END;';
EXECUTE IMMEDIATE dyn_stmt USING b;
END;
我正在构建一个程序,需要从用户那里获得输入以打印一些细节。但是当我使用 & 获取值时,它会因错误而失败。逻辑如下..
DBMS_OUTPUT.PUT_LINE('Enter Y to display Unauthorized records OR N to skip the display');
--SELECT &1 INTO lv_choice FROM DUAL;
IF NOT ('&lv_choice'='Y') THEN
DBMS_OUTPUT.PUT_LINE ('RECORDS WILL NOT BE DISPLAYED');
ELSE
DBMS_OUTPUT.PUT_LINE ('RECORDS TO BE DISPLAYED ARE:');
......
我曾尝试将 &1 用于双重或直接调用 &lv_choice,但因 PLSQL 内部错误而失败。
是否有任何方法可以从用户那里获取输入以进一步执行该过程?
这在 PL/SQL 中是不可能的 - PL/SQL 无法访问终端(除非你在 运行 程序之前做一些事情 like plug in Java or call your program from a something like SQL*Plus(in which you can use commands like ACCEPT/PROMPT .
&
变量是替代变量,特定于SQL*Plus,而不是PL/SQL
如果您正在使用某些 UI 终端,例如 SQLDeveloper 或 TOAD,您可以使用以下代码实现它:
CREATE OR REPLACE INPUTPROCEDURE (LV_CHOICE IN VARCHAR2)
AS
BEGIN
DBMS_OUTPUT.PUT_LINE('Enter Y to display Unauthorized records OR N to skip the display');
--SELECT &1 INTO lv_choice FROM DUAL;
IF lv_choice <> 'Y' THEN
DBMS_OUTPUT.PUT_LINE ('RECORDS WILL NOT BE DISPLAYED');
ELSE
DBMS_OUTPUT.PUT_LINE ('RECORDS TO BE DISPLAYED ARE:');
END INPUTPROCEDURE;
然后像下面这样调用上面的过程:
DECLARE
dyn_stmt VARCHAR2(200);
b BOOLEAN := TRUE;
BEGIN
dyn_stmt := 'BEGIN INPUTPROCEDURE(:LV_CHOICE); END;';
EXECUTE IMMEDIATE dyn_stmt USING b;
END;