首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PL/SQL SELECT SELECT

PL/SQL SELECT SELECT
EN

Stack Overflow用户
提问于 2015-11-21 20:16:13
回答 2查看 1.4K关注 0票数 0

我很少有通过连接多个表来进行选择的语句。每个select都返回一行,但从该行中的10到20个字段返回。存储这些数据供以后使用的最简单方法是什么?

我想避免创建50个变量并将select写入语句中,对单行使用游标和循环并不是我所读到的最聪明的想法。

有什么好办法吗?

愚蠢的例子,这样你就可以得到一般的想法

代码语言:javascript
复制
SELECT t1.field1
, t1.field2
, t1.field3
, t1.field4
, t2.field5
, t2.field6
, t2.field7
, t3.field8
FROM table1 t1
JOIN table2 t2 ON something
JOIN table3 t3 ON something

对不起,我的英语错了,谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-11-21 20:18:47

从select语句创建一个视图。此后,可以使用<viewname>%ROWTYPE类型的单个变量引用记录。

另一个选项是将select封装在隐式游标循环中:

代码语言:javascript
复制
DECLARE
    strvar VARCHAR2(400); -- demo purpose only
BEGIN
    -- ...
    FOR i IN (
        -- ... here goesyour select statement ...
    ) LOOP
       strvar := i.field1 || i.field2; -- ... whatever
    END LOOP;
    -- ...
END;
-- ...

还有一个选项是声明记录类型和记录变量:

代码语言:javascript
复制
DECLARE
   TYPE tRec IS RECORD (
         field1  table1.field1%TYPE
       , field2  table1.field2%TYPE
       , field3  table1.field3%TYPE
       , field4  table1.field4%TYPE
       , field5  table2.field5%TYPE
       , field6  table2.field6%TYPE
       , field7  table2.field7%TYPE
       , field8  table3.field8%TYPE
   )
   r tRec;
BEGIN
   -- ...
   SELECT --...
     INTO r
     FROM --...
        ;
   -- ...
END;
-- ...
票数 1
EN

Stack Overflow用户

发布于 2015-11-23 07:55:28

每次你做出选择时,你都会有一个游标 --没有办法逃避。

视图和显式游标是重用select语句的一种方法。哪一个是更好的选择取决于情况。

行型-attribute是基于表/视图/游标自动创建记录的简便方法。我认为这是最接近您的需求的PL/SQL可以提供。

代码语言:javascript
复制
create or replace package so51 is
  cursor cursor1 is -- an example single row query
    select
     dual.* -- all table columns included
    ,'Y' as str
    ,rownum as num
    ,sysdate as date_
    from dual
  ;
  function get_data return cursor1%rowtype;
end;
/
show errors

create or replace package body so51 is
  -- function never changes when cursor1 changes
  function get_data return cursor1%rowtype is
    v_data cursor1%rowtype;
  begin
    open cursor1;
    fetch cursor1 into v_data;
    close cursor1;
    return v_data;
  end;
end;
/
show errors

declare
  v_data constant so51.cursor1%rowtype := so51.get_data;
begin
  -- use only the data you need
  dbms_output.put_line('v_data.dummy = ' || v_data.dummy);
  dbms_output.put_line('v_data.str = ' || v_data.str);
  dbms_output.put_line('v_data.num = ' || v_data.num);
  dbms_output.put_line('v_data.date_ = ' || v_data.date_);
end;
/

示例运行

代码语言:javascript
复制
SQL> @so51.sql

Package created.

No errors.

Package body created.

No errors.
v_data.dummy = X
v_data.str = Y
v_data.num = 1
v_data.date_ = 2015-11-23 09:42:02

PL/SQL procedure successfully completed.

SQL>
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33848135

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档