我创建了一个 plsql 循环,提示用户在绑定变量中输入一个值,提示代码写在循环内,以便用户可以在先前的输入被拒绝时重新输入该值。 问题是提示框消息仅在第一次显示,之后循环使用第一次输入的相同值。如何允许用户一次又一次地输入值直到被接受。 以下是我的代码片段。它是在 sql Developer 上执行的:
accept v_input_value prompt 'enter value: ';
DECLARE
value_in number := &v_input_value;
BEGIN
LOOP
-- Prompt the user for input value
--DBMS_OUTPUT.PUT('Enter a value: ');
-- Check if the input value is accepted
IF value_in = 3 THEN
-- Value is accepted, exit the loop
DBMS_OUTPUT.PUT_LINE('Value is accepted, exit the loop.');
EXIT;
ELSE
-- Value is not accepted, prompt for a new value
DBMS_OUTPUT.PUT_LINE('Invalid value. Please try again.');
value_in := &v_input_value;
END IF;
END LOOP;
-- Print the accepted value
DBMS_OUTPUT.PUT_LINE('Accepted value: ' || value_in);
END;
/
替换变量由客户端应用程序(即 SQL*Plus、SQL Developer、SQLCl 或支持替换变量的其他客户端)计算。 Oracle 数据库不支持它。
当客户端应用程序读取语句时,它会看到替换变量并询问您(用户)替换变量应该具有什么值,然后有效地执行查找替换并用您提供的值替换该替换变量的所有实例然后将修改后的查询发送到运行它的数据库。数据库永远不会看到替换变量并且不参与请求用户输入。
如何允许用户一次又一次地输入值,直到被接受。
你不能,SQL 和 PL/SQL 不是那样工作的。
像
&v_input_value
这样的替换(非绑定)变量会在编译 PL/SQL 块时计算一次,而不是在执行时计算。
变量不会、也不可能在 PL/SQL 块内重新计算或重新提升。该块作为数据库中的单个单元执行 - 一旦它被提交执行,它就独立于客户端,客户端只是等待它完成(除非您中断它,客户端也会处理)。 PL/SQL 不是一种交互式语言,您不应将客户端功能(例如替换变量)与 SQL 或 PL/SQL 功能混淆。