0

我正在研究以下两种检索值并稍后通过插入语句存储它的方法。即通过 Pl/SQL 游标或通过直接 SQL。这两种方法有什么优势吗?还是有更有效的方法?

方法一

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);

方法二

dateString  varchar(20);
Select sysdate into dateString from dual;
Insert into table(dateValue)
values(dateString);
4

3 回答 3

6

方法3怎么样:

Insert into table(dateValue)
values(sysdate);

或假设您确实需要进行选择来获取数据:

Insert into table(dateValue)
select dateValue from other_table where ...;

关于在需要一个或另一个时显式游标或 SELECT INTO 是否更可取,我会选择 SELECT INTO 因为如果您希望查询只返回一行,它会更整洁、更安全:

select some_value
into l_var
from other_table
where ...;

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

现在,如果返回的行数与预期不符,您将收到异常(NO_DATA_FOUND 或 TOO_MANY_ROWS)。使用游标,您最终会得到 l_var 不变,或者设置为第一个匹配行的值 - 这可能意味着您有一个错误但不知道。

于 2010-11-17T17:02:06.400 回答
2

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

尽管在适当的情况下,托尼的方法可能比两者都更可取。

如果您还想取回该值,则始终存在RETURNING插入语句的子句。

my_date_value date;
...
INSERT into table(datevalue)
values (sysdate)
returning sysdate into my_date_value;
于 2010-11-17T17:13:08.520 回答
1

我同意@Tony 和@MikeyByCrikey 这select ... into通常更可取,尤其是 - 在我个人的主观意见中 - 因为它将选择和进入保持在一起,而不是在声明部分让选择不可见。如果它很简单,这并不是一个真正的问题,但您建议您正在执行几个大查询和操作,这意味着一个冗长的过程。

有点题外话,但如果所有操作都是在最后为单个插入收集数据,那么与其有很多单独的变量,我会考虑将单个变量声明为行类型并酌情更新列:

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;
于 2010-11-17T17:55:27.757 回答