PLSQL курсор через прямой SQL - PullRequest
0 голосов
/ 17 ноября 2010

Я рассматриваю следующие два способа получения значения и его последующего хранения с помощью оператора вставки.т.е. через курсоры 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 ]

6 голосов
/ 17 ноября 2010

Как насчет подхода 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 без изменений или установите значение из первой подходящей строки - это, вероятно, означает, что у вас есть ошибка, но вы ее не знаете.

2 голосов
/ 17 ноября 2010

У каждого подхода есть свои достоинства, но если это одно и только одно значение, которое вы получаете, я бы выбрал select ... into ..., так как это намного проще и проверит, что у вас есть одно и только одно значение.

Хотя подход Тони, возможно, предпочтительнее обоих при правильных обстоятельствах.

Если вы также хотите получить значение обратно, всегда есть предложение RETURNING оператора вставки.

my_date_value date;
...
INSERT into table(datevalue)
values (sysdate)
returning sysdate into my_date_value;
1 голос
/ 17 ноября 2010

Я бы согласился с @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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...