Oracle plsql游标通过直接sql
我正在研究以下两种方法来检索一个值,并在以后通过insert语句存储它。i、 e.通过Pl/SQL游标或直接SQL。 这两种方法都有好处吗?还是有更有效的方法 方法1Oracle 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
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有一个返回子句。