powered by simpleCommunicator - 2.0.29     © 2024 Programmizd 02
Map
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как можно выполнить строку из курсора в PL/SQL
18 сообщений из 18, страница 1 из 1
Как можно выполнить строку из курсора в PL/SQL
    #40108967
Igor Karmanov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем доброго времени суток.

Объявляю курсор:

Код: plsql
1.
2.
3.
DECLARE CURSOR AM 
IS
SELECT...



Селект пишет в курсор AM следующие строки с апдейтами:

Код: plsql
1.
UPDATE CMS_RBRU.T_PE_COBJECT SET CURRENTACCOUNTBALANCE = 'XXXXXX', ACCOUNTCREDITED = 'YYYYYYYYYYYYYYYYYYYY', ACCOUNTDEBITED = 'ZZZZZZZZZZZZZZ' where CMSID = 'WWWWWWWW' ;


Таких апдейтов много.

Далее объявляем переменную proc_str AM%ROWTYPE;

и далее

Код: plsql
1.
2.
3.
4.
OPEN AM;
LOOP
   FETCH AM INTO proc_str; 
   EXIT WHEN AM%NOTFOUND;



Подскажите, пожалуйста, каким образом мне можно запустить апдейты в теле цикла LOOP командой EXEC?
...
Рейтинг: 0 / 0
Как можно выполнить строку из курсора в PL/SQL
    #40108970
yens_gjytk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Igor Karmanov,

EXECUTE IMMEDIATE
...
Рейтинг: 0 / 0
Как можно выполнить строку из курсора в PL/SQL
    #40108971
Igor Karmanov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
yens_gjytk,

да, сорри, я ошибся, спасибо

Делаю так
Код: plsql
1.
EXECUTE IMMEDIATE proc_str; 

в теле LOOP, но в ответ:
Error report -
ORA-06550: Строка 34, столбец 23:
PLS-00382: выражение неправильного типа
ORA-06550: Строка 34, столбец 4:
PL/SQL: Statement ignored
06550. 00000 - "line %s, column %s:\n%s"
*Cause: Usually a PL/SQL compilation error.
*Action:

Может быть надо как-то преобразовать proc_str перед попыткой его выполнения?
...
Рейтинг: 0 / 0
Как можно выполнить строку из курсора в PL/SQL
    #40108973
yens_gjytk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Igor Karmanov,

proc_str имеет тип RECORD, вам нужно извлечь из этой записи поле, содержащее текст команды.
...
Рейтинг: 0 / 0
Как можно выполнить строку из курсора в PL/SQL
    #40108974
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Igor Karmanov,

proc_str AM% ROWTYPE

Вам надо поле (строку с апдейтами)

....
stax
...
Рейтинг: 0 / 0
Как можно выполнить строку из курсора в PL/SQL
    #40108978
Igor Karmanov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Stax,

спасибо, извиняюсь, не силен в PL/SQL. Подскажите, пожалуйста, могу ли объявить так?
Код: plsql
1.
proc_str VARCHAR(500);



После такого изменения скрипта, выходит ошибка на строке кода
Код: plsql
1.
 EXECUTE IMMEDIATE  proc_str;

:

Error report -
ORA-00933: неверное завершение SQL-предложения
ORA-06512: на line 34
00933. 00000 - "SQL command not properly ended"
*Cause:
*Action:
...
Рейтинг: 0 / 0
Как можно выполнить строку из курсора в PL/SQL
    #40108980
Igor Karmanov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
yens_gjytk,

Да, спасибо, не силен в PL/SQL, не подскажете, как можно извлечь? Буду премного благодарен)
...
Рейтинг: 0 / 0
Как можно выполнить строку из курсора в PL/SQL
    #40108981
yens_gjytk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Igor Karmanov,
Покажите полностью определение курсора
Код: plsql
1.
2.
3.
DECLARE CURSOR AM 
IS
SELECT...
...
Рейтинг: 0 / 0
Как можно выполнить строку из курсора в PL/SQL
    #40108983
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Igor Karmanov
Stax,

спасибо, извиняюсь, не силен в PL/SQL. Подскажите, пожалуйста, могу ли объявить так?
Код: plsql
1.
proc_str VARCHAR2(500); --на всяк случ





тогда и

DECLARE CURSOR AM
IS
SELECT поле с текстом update FROM ...

....
stax
...
Рейтинг: 0 / 0
Как можно выполнить строку из курсора в PL/SQL
    #40108984
Igor Karmanov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
yens_gjytk,

Вот:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
DECLARE CRUSOR AM 
IS
SELECT DISTINCT 
CASE
WHEN co.CONTRACTGROUPID = 'G4' THEN 'UPDATE CMS_RBRU.T_PE_COBJECT SET CURRENTACCOUNTBALANCE = '''|| regexp_replace(co.amount, '^(-?)([.,])', '\10\2') ||''', ACCOUNTCREDITED = '''|| cra.ACCNO || ''', ACCOUNTDEBITED = '''|| dea.ACCNO ||''' where CMSID = '''|| co.SOURCEID || ''' ;'
WHEN co.CONTRACTGROUPID != 'G4' THEN 'UPDATE CMS_RBRU.T_PE_COBJECT SET CURRENTACCOUNTBALANCE = '''|| regexp_replace(co.amount, '^(-?)([.,])', '\10\2') ||''', ACCOUNTDEBITED = '''|| cra.ACCNO || ''', ACCOUNTCREDITED = '''|| dea.ACCNO ||''' where CMSID = '''|| co.SOURCEID || ''' ;'
END AS "script"
FROM CMS_OBJECTS co
INNER JOIN CMS_ACCOUNTS cra ON cra.id = co.CONTRAACCOUNT_ID
INNER JOIN CMS_ACCOUNTS dea ON dea.id = co.MAINACCOUNT_ID
INNER JOIN CMS_MSG_OBJECTS cmo ON cmo.SOURCEID = co.SOURCEID
WHERE cmo.MESSAGE_ID in (select m.id
from cms_am.cms_MSG_OBJECTS mo
right join cms_am.cms_messages m on mo.message_id=m.id
where 1=1
and mo.id > 106484987
and mo.RESPONSEMESSAGEDATE >= TO_TIMESTAMP(CURRENT_DATE,'dd.mm.yy')
and mo.status ='SENT'
and m.operation = 'bindToDeal');
...
Рейтинг: 0 / 0
Как можно выполнить строку из курсора в PL/SQL
    #40108985
yens_gjytk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Igor Karmanov,

Код: plsql
1.
EXECUTE IMMEDIATE proc_str."script";
...
Рейтинг: 0 / 0
Как можно выполнить строку из курсора в PL/SQL
    #40108992
Igor Karmanov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
yens_gjytk,

Огромное спасибо, заработало ! Я пробовал без кавычек в script ! ))
...
Рейтинг: 0 / 0
Как можно выполнить строку из курсора в PL/SQL
    #40109003
Igor Karmanov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
yens_gjytk,

извиняюсь, закомментил строку
Код: plsql
1.
EXECUTE IMMEDIATE  proc_str."script" ;


поэтому всё и прошло нормально, с выводом
Код: plsql
1.
DBMS_OUTPUT.PUT_LINE('upd= '|| proc_str."script");



Ошибка осталась ((

Error report -
ORA-00933: неверное завершение SQL-предложения
ORA-06512: на line 34
00933. 00000 - "SQL command not properly ended"
*Cause:
*Action:
...
Рейтинг: 0 / 0
Как можно выполнить строку из курсора в PL/SQL
    #40109008
Igor Karmanov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Выведу сюда весь скрипт, почистил от всего ненужного.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
SET SERVEROUTPUT ON  
declare  cursor am 
is
SELECT DISTINCT 
CASE
WHEN co.CONTRACTGROUPID = 'G4' THEN 'UPDATE CMS_RBRU.T_PE_COBJECT SET CURRENTACCOUNTBALANCE = '''|| regexp_replace(co.amount, '^(-?)([.,])', '\10\2') ||''', ACCOUNTCREDITED = '''|| cra.ACCNO || ''', ACCOUNTDEBITED = '''|| dea.ACCNO ||''' where CMSID = '''|| co.SOURCEID || ''' ;'
WHEN co.CONTRACTGROUPID != 'G4' THEN 'UPDATE CMS_RBRU.T_PE_COBJECT SET CURRENTACCOUNTBALANCE = '''|| regexp_replace(co.amount, '^(-?)([.,])', '\10\2') ||''', ACCOUNTDEBITED = '''|| cra.ACCNO || ''', ACCOUNTCREDITED = '''|| dea.ACCNO ||''' where CMSID = '''|| co.SOURCEID || ''' ;'
END AS "script"
FROM CMS_OBJECTS co
INNER JOIN CMS_ACCOUNTS cra ON cra.id = co.CONTRAACCOUNT_ID
INNER JOIN CMS_ACCOUNTS dea ON dea.id = co.MAINACCOUNT_ID
INNER JOIN CMS_MSG_OBJECTS cmo ON cmo.SOURCEID = co.SOURCEID
WHERE cmo.MESSAGE_ID in (select m.id
from cms_am.cms_MSG_OBJECTS mo
right join cms_am.cms_messages m on mo.message_id=m.id
where 1=1
and mo.id > 106484987
and mo.RESPONSEMESSAGEDATE >= TO_TIMESTAMP(CURRENT_DATE,'dd.mm.yy')
and mo.status ='SENT'
and m.operation = 'bindToDeal');

--Объявление переменных
proc_str am%ROWTYPE; 
obj_counter NUMBER:=0;


BEGIN
DBMS_OUTPUT.PUT_LINE ('STARTING');
DBMS_OUTPUT.PUT_LINE ('-----------------------------------------------------------------------------------------------');
OPEN am;
LOOP
   FETCH am INTO proc_str; 
   EXIT WHEN am%NOTFOUND;
   EXECUTE IMMEDIATE  proc_str."script" ;
   DBMS_OUTPUT.PUT_LINE('upd= '|| proc_str."script");
   obj_counter:=obj_counter+1;
END LOOP;
DBMS_OUTPUT.PUT_LINE('Количество апдейтов = ' || obj_counter);
CLOSE am;
END;
...
Рейтинг: 0 / 0
Как можно выполнить строку из курсора в PL/SQL
    #40109010
Asmodeus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Igor Karmanov
yens_gjytk,

Огромное спасибо, заработало ! Я пробовал без кавычек в script ! ))
Уберите в псевдониме колонки кавычки - будет работать и без кавычек.

Database Object Names and Qualifiers Nonquoted identifiers are not case sensitive. Oracle interprets them as uppercase. Quoted identifiers are case sensitive.
...
Рейтинг: 0 / 0
Как можно выполнить строку из курсора в PL/SQL
    #40109011
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Igor Karmanov,

EXECUTE IMMEDIATE rtrim(proc_str."script" , ';');

ps
ой, копию CMS_RBRU.T_PE_COBJECT хоть сделайте, а то можно наменять с нашими советоми
.....
stax
...
Рейтинг: 0 / 0
Как можно выполнить строку из курсора в PL/SQL
    #40109016
Asmodeus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Igor Karmanov
yens_gjytk,

извиняюсь, закомментил строку
Код: plsql
1.
EXECUTE IMMEDIATE  proc_str."script" ;


поэтому всё и прошло нормально, с выводом
Код: plsql
1.
DBMS_OUTPUT.PUT_LINE('upd= '|| proc_str."script");



Ошибка осталась ((

Error report -
ORA-00933: неверное завершение SQL-предложения
ORA-06512: на line 34
00933. 00000 - "SQL command not properly ended"
*Cause:
*Action:


Код: plsql
1.
WHEN co.CONTRACTGROUPID = 'G4' THEN 'UPDATE CMS_RBRU.T_PE_COBJECT SET CURRENTACCOUNTBALANCE = '''|| regexp_replace(co.amount, '^(-?)([.,])', '\10\2') ||''', ACCOUNTCREDITED = '''|| cra.ACCNO || ''', ACCOUNTDEBITED = '''|| dea.ACCNO ||''' where CMSID = '''|| co.SOURCEID || ''' ;'



EXECUTE IMMEDIATE Statement
Except for multi-row queries, the dynamic string can contain any SQL statement (without the final semicolon) or any PL/SQL block (with the final semicolon). The string can also contain placeholders for bind arguments.
...
Рейтинг: 0 / 0
Как можно выполнить строку из курсора в PL/SQL
    #40109035
Igor Karmanov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Stax, yens_gjytk, спасибо, убрал из UPDATE точку с запятой в конце, всё заработало! =)
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как можно выполнить строку из курсора в PL/SQL
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]