Plsql 无法在select语句中使用过程?
下面是我创建类型和表的代码。完全正确:Plsql 无法在select语句中使用过程?,plsql,procedure,Plsql,Procedure,下面是我创建类型和表的代码。完全正确: 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_t
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”的函数
655300000-“请-%s:%s”
*原因:*行动: 第49行第38列出错
我想知道这是否是因为我不能在select语句中使用过程?不,不能在SQL语句中使用过程 过程
DISPLAY
只能在PL/SQL上下文中使用
请参阅Oracle文档:不,不能在SQL语句中使用过程 过程
DISPLAY
只能在PL/SQL上下文中使用
请参阅Oracle文档:是否因为该过程可能返回多条记录?但同时函数只返回一条记录,这样就可以在SQL select语句中使用它,因为过程不返回值(OUT参数除外)。是的,函数返回一个值(不带OUT参数的情况除外,但这些参数也不能在SQL中使用)。这就是函数可以在SQL中使用的原因。若过程只返回一个带OUT参数的值,那个么它可以在SQL中使用吗?当然不能。一般来说,SQL中不能使用过程。您的匿名PL/SQL块看起来不错,为什么要用SQL打印一些东西?如果您绝对需要SQL中的输出,请将其包装到函数中。不太好,但仅用于开发或测试目的。明白了。谢谢您的帮助。是因为该过程可能返回多条记录吗?但同时函数只返回一条记录,这样就可以在SQL select语句中使用它,因为过程不返回值(OUT参数除外)。是的,函数返回一个值(不带OUT参数的情况除外,但这些参数也不能在SQL中使用)。这就是函数可以在SQL中使用的原因。若过程只返回一个带OUT参数的值,那个么它可以在SQL中使用吗?当然不能。一般来说,SQL中不能使用过程。您的匿名PL/SQL块看起来不错,为什么要用SQL打印一些东西?如果您绝对需要SQL中的输出,请将其包装到函数中。不太好,但仅用于开发或测试目的。明白了。谢谢你的帮助。