sql - 如何输出多个实体?(oracle sql)

标签 sql database oracle stored-procedures oracle-sqldeveloper

我有两张 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/

相关文章:

sql - 了解 "Not found: Dataset ### was not found in location US"错误

sql - 对非嵌套数组进行字符串操作后过滤行

php - 为什么它没有重定向

oracle - 如果我不使用随机数据对 Oracle 11g 进行压力测试有什么关系吗

mysql - 更改已关闭(但未解除分配)CURSOR 的 SELECT

oracle - 几个Oracle Pl/SQL 包的编译可以是一个原子操作吗?

php - 如何修改此有效的 SQL SELECT/JOIN 查询以删除重复项?

mysql - 正确连接多个多对多表 - MySQL 查询

c# - 在 Visual Studio Ultimate 2010 中添加 MySQL.Data 作为引用

php - 基于引用表值连接表