我有两张 table 。模型和汽车。以及使用用户输入的名称及其价格(存储在 AUTOMOBILES 中)导出所有模型的过程。
create or REPLACE procedure modelzz( VAR_MODEL IN MODELS.NAME_MODEL%TYPE,
VAR_PRICE OUT AUTOMOBILES.A_PRICE%TYPE )
as
begin
SELECT a.A_PRICE
INTO VAR_PRICE
FROM AUTOMOBILES a
join MODELS m
on a.MODELS_ID_MODEL=m.ID_MODEL
where m.NAME_MODEL=VAR_MODEl;
dbms_output.put_line(VAR_MODEL||'''s price is : '||VAR_PRICE);
END;
程序开始:
var v_modelzz varchar2;
exec modelzz('&model_name',:v_modelzz);
问题是我想导出特定模型的所有实体。他们的不止一个,一个模型可以有两个或更多的记录。我知道这不切实际。这只是测试。错误如下:exact fetch 返回的行数多于请求的行数
最佳答案
你应该创建 oracle 类型(我没有测试过这段代码,只是一个例子):
create type v_price_array
as table of AUTOMOBILES.A_PRICE%TYPE ;
将过程返回类型更改为:
create or REPLACE procedure modelzz( VAR_MODEL IN MODELS.NAME_MODEL%TYPE,
VAR_PRICES OUT v_price_array )
Or return created array type from function instead of procedure.
并更改您的选择:
SELECT a.A_PRICE
BULK COLLECT INTO VAR_PRICES
FROM AUTOMOBILES a
join MODELS m
on a.MODELS_ID_MODEL=m.ID_MODEL
where m.NAME_MODEL=VAR_MODEl;
dbms_output.put_line(VAR_MODEL ||''s price is : '||VAR_PRICE);
第二种方式是在 OUT 参数中返回 sys_refcursor。然后你必须在过程中打开游标:
create or REPLACE procedure modelzz( VAR_MODEL IN MODELS.NAME_MODEL%TYPE,
VAR_PRICES OUT SYS_REFCURSOR )
as
begin
OPEN VAR_PRICES FOR
SELECT a.A_PRICE
FROM AUTOMOBILES a
join MODELS m
on a.MODELS_ID_MODEL=m.ID_MODEL
where m.NAME_MODEL=VAR_MODEl;
dbms_output.put_line(VAR_MODEL ||''s price is : '||VAR_PRICE);
END;
我推荐第二种方式。
关于sql - 如何输出多个实体?(oracle sql),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47612043/