PLSQL 过程在运行时获取用户输入
Posted
技术标签:
【中文标题】PLSQL 过程在运行时获取用户输入【英文标题】:PLSQL Procedure get user input at runtime 【发布时间】:2012-12-03 13:09:53 【问题描述】:我正在做一个大学作业,要求我创建一个 PLSQL 过程,用户可以在其中添加一个新的客户订单,其中包含许多项目和每个项目的数量。我想出了以下方法,它会要求用户输入要添加到订单中的一些项目,然后使用循环来询问特定的详细信息,例如产品编号和数量。我在运行时遇到用户输入问题...编译代码时它会询问产品代码和数量,并且不会在运行时再次询问,而是保存之前在编译时给出的值...
CREATE OR REPLACE
PROCEDURE Add_Order (Item_amount IN NUMBER, CustNo IN NUMBER) AS
ItemNo NUMBER;
var_Quantity NUMBER;
var_PONo NUMBER;
BEGIN
IF Item_amount BETWEEN 2 AND 9 THEN
SELECT seq_PONo.NEXTVAL INTO var_PONo from dual;
INSERT INTO PurchaseOrder_tab
SELECT var_PONo, REF(C),
SYSDATE,
ItemList_tab()
FROM Customer_tab C
WHERE C.CustNo = CustNo;
FOR i IN 1..Item_amount LOOP
DBMS_OUTPUT.PUT_LINE('INSIDE LOOP');
ItemNo := &Enter_ProdCode;
var_Quantity := &Quantity_Amount;
INSERT INTO TABLE (
SELECT P.ItemList
FROM PurchaseOrder_tab P
WHERE P.PONo = var_PONo
)
SELECT seq_ItemNo.nextval, REF(Pr), var_Quantity
FROM Products_tab Pr
WHERE Pr.ProductCode = ItemNo ;
DBMS_OUTPUT.PUT_LINE('Added '||var_Quantity ||' items of '||ItemNo||' to order No: '||var_PONo);
END LOOP;
ELSE
DBMS_OUTPUT.PUT_LINE('Amount of items entered onto an order must be between 2 - 9. Please try again with correct amount.');
END IF;
EXCEPTION
WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('Operation failed '||'SQLCODE: '||SQLCODE);
DBMS_OUTPUT.PUT_LINE('SQL Error Message '||SQLERRM);
ROLLBACK;
END;
/
【问题讨论】:
&
提示用户输入是sqlplus
命令而不是plsql
,这就是它只提示的原因。但是整个概念对我来说听起来是错误的......该函数应该将某些结构(数组或其他)中的项目和数量作为参数,并且 UI 或脚本应该在调用函数之前提示用户输入值。
【参考方案1】:
简短的回答:你不能。 PL/SQL 在数据库引擎内部执行,数据库引擎无法访问您用来启动程序的终端窗口(或数据库工具)。
您问题中的代码似乎部分工作,因为它要求输入一次,但真正发生的是:工具(SQL*Plus、SQL Developer 或其他)解析 PL/SQL 块并看到 & -Signs,所以它会询问用什么来替换它们。一旦给出输入,PL/SQL 块(包括输入的值)就会被交给数据库执行。
由于在 PL/SQL 中无法做到这一点,最好先创建一个前端程序来收集值,然后将它们发送到数据库。
【讨论】:
我不能害怕,反正不适合这个任务。看起来它回到了绘图板上,另一个程序可以满足我的需要 =(【参考方案2】:尝试玩弄:
BEGIN
DBMS_OUTPUT.GET_LINE(:buffer, :status);
END;
而不是使用&
引用
【讨论】:
我已经看过了,但无法弄清楚您如何使用它从用户那里获取价值?get_line
从由其他dbms_output
过程填充的缓冲区中检索数据;它与从用户那里获取数据无关。【参考方案3】:
从用户那里获取数据输入,
设置服务器输出;
ACCEPT Enter_ProdCode VARCHAR2 PROMPT "请输入产品代码:"; ItemNo := &Enter_ProdCode;
【讨论】:
以上是关于PLSQL 过程在运行时获取用户输入的主要内容,如果未能解决你的问题,请参考以下文章