显示Oracle中过程的输出



该过程使用前面的函数来显示产品列表:num、名称和应用程序上的提及。

SET SERVEROUTPUT ON;
CREATE OR REPLACE FUNCTION STORE(num_produit IN INTEGER) RETURN VARCHAR AS
N INTEGER := 0;
incre INTEGER := 0;
BEGIN
SELECT SUM(qte) INTO N FROM Ligne_Fact WHERE num_produit = produit;
IF N > 15 THEN
RETURN 'fort';
ELSIF N > 11 THEN
RETURN 'moyen';
END IF;
RETURN 'faible';
END;
/
CREATE OR REPLACE PROCEDURE SHOW_PRODUITS IS
SOME_VAR VARCHAR2(256);
BEGIN
SELECT num, designation, STORE(num) INTO SOME_VAR FROM Produit;
dbms_output.enable();
dbms_output.put_line('result : '|| SOME_VAR);
END;
/
BEGIN
SHOW_PRODUITS;
END;
/

我确信所有的表都填充了一些伪数据,但我得到了以下错误:

Function STOCKER compiled
Procedure AFFICHER_PRODUITS compiled
LINE/COL  ERROR
--------- -------------------------------------------------------------
4/4       PL/SQL: SQL Statement ignored
4/56      PL/SQL: ORA-00947: not enough values
Errors: check compiler log
Error starting at line : 28 in command -
BEGIN
AFFICHER_PRODUITS;
END;
Error report -
ORA-06550: line 2, column 5:
PLS-00905: object SYSTEM.SHOW_PRODUITS is invalid
ORA-06550: line 2, column 5:
PL/SQL: Statement ignored
06550. 00000 -  "line %s, column %s:n%s"
*Cause:    Usually a PL/SQL compilation error.

您犯的第一个主要错误是在SYSTEM模式中创建对象。它和SYS一样,都是特殊,只能用于系统维护。创建你自己的用户,并在那里做你正在做的任何事情。

对于您的问题:select返回3个值,但您试图将它们放入一个some_var变量中。那行不通。添加另一个局部变量(用于numdesignation(,或从select:中删除这些列

CREATE OR REPLACE PROCEDURE SHOW_PRODUITS IS
SOME_VAR VARCHAR2(256);
BEGIN
SELECT STORE(num) INTO SOME_VAR FROM Produit;    --> here
dbms_output.enable();
dbms_output.put_line('result : '|| SOME_VAR);
END;
/

正如您所说,代码假设produit包含一条记录(它不能为空,也不能有2行或更多行,因为您会遇到各种错误(。

也许您想访问所有行;在这种情况下,考虑使用循环,例如

CREATE OR REPLACE PROCEDURE SHOW_PRODUITS IS
SOME_VAR VARCHAR2(256);
BEGIN
FOR cur_r IN (SELECT num, designation, STORE(num) some_var FROM Produit) LOOP
dbms_output.put_line(cur_r.num ||', '|| cur_r.designation ||', result : '|| cur_r.some_var);
END LOOP;
END;
/

然后

set serveroutput on
BEGIN
SHOW_PRODUITS;
END;
/

您正试图编译某个存储例程,该例程调用另一个名为AFFICHER_PRODUITS的存储例程,并且该例程调用SHOW_PRODUITS,但SHOW_PRODUITS未编译,因此出现错误。(顺便说一句,建议不要在SYSTEM模式中创建自己存储的例程。(

SHOW_PRODUITS由于以下行而未编译:

SELECT num, designation, STORE(num) INTO SOME_VAR FROM Produit;

您似乎希望以字符串形式获取查询结果。为了做到这一点,您需要连接列值,即

SELECT num || designation || STORE(num) INTO SOME_VAR FROM Produit;

当然,如果您只想使用DBMS_OUTPUT显示查询结果,那么您可以为每列声明一个单独的变量。

CREATE OR REPLACE PROCEDURE SHOW_PRODUITS IS
SOME_NUM Produit.num%type;
SOME_DES Produit.designation%type;
SOME_VAR VARCHAR2(6);
BEGIN
SELECT num
,designation
,STORE(num)
INTO SOME_NUM
,SOME_DES
,SOME_VAR
FROM Produit;
dbms_output.enable();
dbms_output.put_line('result : ' || SOME_NUM || SOME_DES || SOME_VAR);
END;

请注意,如果查询返回多行,则[可能]需要使用游标。

CREATE OR REPLACE PROCEDURE SHOW_PRODUITS IS
SOME_NUM Produit.num%type;
SOME_DES Produit.designation%type;
SOME_VAR VARCHAR2(6);
--
CURSOR c1 IS
SELECT num, designation, STORE(num) FROM Produit;
BEGIN
OPEN c1;
LOOP
FETCH c1 INTO SOME_NUM, SOME_DES, SOME_VAR;
EXIT WHEN c1%NOTFOUND;
dbms_output.put_line('result : ' || SOME_NUM || SOME_DES || SOME_VAR);
END LOOP;
CLOSE c1;
END;

最新更新