【问题标题】:Cannot use procedure in the select statement?不能在 select 语句中使用过程?
【发布时间】:2016-03-08 18:02:36
【问题描述】:

下面是我创建类型和表的代码。都是正确的:

CREATE TYPE shape_typ AS OBJECT (
l   INTEGER, -- length
w   INTEGER, -- width
h   INTEGER, -- height
MEMBER FUNCTION area RETURN INTEGER,
MEMBER FUNCTION volume RETURN INTEGER,
MEMBER PROCEDURE display (SELF IN OUT NOCOPY shape_typ) );

CREATE TYPE BODY shape_typ AS 
MEMBER FUNCTION volume RETURN INTEGER IS
BEGIN
   RETURN l * w * h;
-- same as previous line RETURN SELF.l * SELF.w * SELF.h; 
END;
MEMBER FUNCTION area RETURN INTEGER IS
BEGIN -- not necessary to include SELF in following
    RETURN 2 * (l * w + l * h + w * h);
END;
MEMBER PROCEDURE display (SELF IN OUT NOCOPY shape_typ) IS
  BEGIN
   DBMS_OUTPUT.PUT_LINE('Length: ' || l || ' - ' || 
                        'Width: ' || w || ' - ' ||
                        'Height: ' || h );
   DBMS_OUTPUT.PUT_LINE('Volume: ' || volume || ' - ' || 
                        'Area: ' || area );
  END;
END;

CREATE TABLE shapes (
shape       shape_typ,
create_date DATE );

INSERT INTO shapes VALUES (
shape_typ (3,3,3), '17-MAR-2008' );

INSERT INTO shapes VALUES (
shape_typ (1,8,2), '17-FEB-2008' );

INSERT INTO shapes VALUES (
shape_typ (1,1,1), '27-MAR-2008' );

SELECT s.shape.l,s.shape.w,s.shape.h,s.shape.area() FROM shapes s;

DECLARE
shap shapes%rowtype;
BEGIN -- PL/SQL block for selecting-displaying a student
  SELECT * INTO shap
    FROM shapes s 
    WHERE s.shape.l=1 and s.shape.w=1 and s.shape.h=1;
  shap.shape.display;
END;

但是,当我尝试在以下语句中执行该过程时,它给了我一条错误消息。

SELECT s.shape.l,s.shape.w,s.shape.h,s.shape.display() FROM shapes s;

错误信息是:

ORA-06553:PLS-222:此范围内不存在名为“DISPLAY”的函数 06553. 00000 - “PLS-%s: %s” *原因:
*行动: 行错误:49 列:38

我想知道是不是因为我不能在 select 语句中使用该过程?

【问题讨论】:

    标签: plsql procedure


    【解决方案1】:

    不,您不能在 SQL 语句中使用过程。

    过程 DISPLAY 只能在 PL/SQL 上下文中使用。

    查看 Oracle 文档:Coding PL/SQL Subprograms and Packages

    【讨论】:

    • 是不是因为该过程可能返回多条记录?但同时函数只返回一条记录,以便在 SQL select 语句中使用?
    • 因为过程不返回值(OUT 参数除外)。是的,函数返回一个值(OUT 参数除外,但也不能在 SQL 中使用)。这就是为什么函数可以在 SQL 中使用。
    • 如果procedure只返回一个带OUT参数的值,那么可以在SQL中使用吗?
    • 绝对不是。通常,过程不能在 SQL 中使用。您的匿名 PL/SQL 块看起来不错,为什么要在 SQL 中打印一些东西?如果您绝对需要 SQL 中的输出,请将其包装到一个函数中。不好,但仅可用于开发或测试目的。
    • 知道了。感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-03
    • 1970-01-01
    • 1970-01-01
    • 2011-08-27
    • 2012-11-19
    • 2016-01-06
    相关资源
    最近更新 更多