Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle plsql游标通过直接sql_Oracle_Plsql_Plsqldeveloper - Fatal编程技术网

Oracle plsql游标通过直接sql

Oracle plsql游标通过直接sql,oracle,plsql,plsqldeveloper,Oracle,Plsql,Plsqldeveloper,我正在研究以下两种方法来检索一个值,并在以后通过insert语句存储它。i、 e.通过Pl/SQL游标或直接SQL。 这两种方法都有好处吗?还是有更有效的方法 方法1 Cursor system_date Is select sysdate from dual; system_date_rec system_date%type; Open system_Date; Fetch system_date into system_date_rec; Insert into table(date

我正在研究以下两种方法来检索一个值,并在以后通过insert语句存储它。i、 e.通过Pl/SQL游标或直接SQL。 这两种方法都有好处吗?还是有更有效的方法

方法1

Cursor system_date
Is 
 select sysdate from dual;
system_date_rec system_date%type;

Open system_Date;
Fetch system_date into system_date_rec;

Insert into table(dateValue)
values(system_date_rec.date);
方法2

dateString  varchar(20);
Select sysdate into dateString from dual;
Insert into table(dateValue)
values(dateString);
方法3如何:

Insert into table(dateValue)
values(sysdate);
或者假设您确实需要进行选择以获取数据:

Insert into table(dateValue)
select dateValue from other_table where ...;
关于当需要一个或另一个游标时,显式游标或选择入是更好的选择,我会选择选择入,因为如果您希望查询只返回一行,则选择入会更整洁、更安全:

select some_value
into l_var
from other_table
where ...;

if l_var = 'A' then
  do_something;
end if;

现在,如果返回的行数不符合预期,将出现异常(找不到数据或行太多)。有了光标,你只需将l_var保持不变,或者设置为第一个匹配行中的值-这可能意味着你有一个bug但不知道它。

每种方法都有它的优点,但如果你得到的是一个且只有一个值,那么我会选择
select。。。进入…
,因为这要简单得多,并且将检查您是否有且只有一个值

虽然在适当的情况下,托尼的方法可能比两者都好

如果还希望返回值,则insert语句中始终有
RETURNING
子句

my_date_value date;
...
INSERT into table(datevalue)
values (sysdate)
returning sysdate into my_date_value;

我同意@Tony和@Mikeybycrickey的观点,
选择。。。into
通常更可取,尤其是在我个人的主观观点中,因为它将select和into放在一起,而不是将select放在declare部分看不见的地方。如果简单的话,这并不是一个真正的问题,但是您已经建议您要进行几个大的查询和操作,这意味着一个较长的过程

稍微偏离主题,但是如果所有操作都是在最后收集单个插入的数据,那么不是考虑有很多单独的变量,我会考虑将单个变量声明为行类型并适当地更新列:

declare
    l_row my_table%ROWTYPE;
begin
    select ... into l_row.column1;
    select ... into l_row.column2;
    if l_row.column2 = 'A' then
        /* do something */
    end if;
    l_row.column3 := 'somevalue';
    fetch ... into l_row.column4;
    /* etc */
    insert into my_table values l_row;
end;

“sysdate”只是一个演示这些方法的示例,但它并不是我真正想要做的。我只是想知道这两种方法中哪一种在性能方面更有效。我有时不得不写几个大的查询,并通过访问游标或局部变量来处理结果。您知道这两种方法之间是否存在性能差异吗?谢谢:)我相信选择进入会稍微快一点。每次我回头看这个答案都比上次长!我知道,活着思考!有趣的是,我不知道insert有一个返回子句。