程序可以将用户 运行 时间输入作为参数吗?

Can procedures take user run-time input as parameters?

我是 plsql 的新手,我有一个我认为相当基本的问题。

我已经创建了以下程序,它完全符合我的要求:

CREATE or REPLACE PROCEDURE proc_list_similar_recipes(idr_p IN recipe.idr%TYPE)

AS
  idr_row recipe%ROWTYPE;
  v_similarity NUMBER;
  v_title VARCHAR2(200);

BEGIN  
  FOR idr_row IN (SELECT * FROM recipe ORDER BY idr) LOOP
    SELECT recipetitle
    INTO v_title
    from RECIPE
    WHERE IDR = idr_p;
    v_similarity := func_similarity(idr_p, idr_row.idr);
    DBMS_OUTPUT.PUT_LINE('Similarity between ' || v_title || 'idR(' || idr_p || ') and '|| idr_row.recipetitle || '(idR' || idr_row.idr || '): ' || v_similarity);
    END LOOP;
END proc_list_similar_recipes;

为了测试它的 it/get 输出,我正在制作简单的匿名块,如下所示:

SET SERVEROUPUT ON
SET VERIFY OFF
ACCEPT prompt_idr PROMPT 'Please enter a valid id'
DECLARE
  prompt_idr number :=&prompt_idr;
BEGIN
  proc_list_similar_recipes(prompt_idr);

END;
/

但是问题的说明说明我的程序应该"prompt the user for an value"?是否可以在没有额外匿名块的情况下执行此操作?

But the specification of the problem states that my procedure should "prompt the user for an value"?

事实是PL/SQL不是交互式的。

如果您的要求严格提示并且接受来自用户的值,那么PL/SQL 不是一个好的解决方案。 PL/SQL 代码是 编译的 并存储在 数据库 中,因此它 不是交互式的 .

此外,&用于SQL*Plus中的变量替换,提供SQL*Plus并不是good/feasible的想法作为用户输入值的用户界面。

我强烈推荐前端 应用程序 来满足这种需求。 PL/SQL 没有交互性,不适合放在这里。 SQL*Plus 作为界面对用户来说将是一场噩梦。