Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как можно выполнить строку из курсора в PL/SQL / 18 сообщений из 18, страница 1 из 1
03.11.2021, 14:49
    #40108967
Igor Karmanov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как можно выполнить строку из курсора в PL/SQL
Всем доброго времени суток.

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

Код: 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
03.11.2021, 14:51
    #40108970
yens_gjytk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как можно выполнить строку из курсора в PL/SQL
Igor Karmanov,

EXECUTE IMMEDIATE
...
Рейтинг: 0 / 0
03.11.2021, 14:57
    #40108971
Igor Karmanov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как можно выполнить строку из курсора в PL/SQL
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
03.11.2021, 15:05
    #40108973
yens_gjytk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как можно выполнить строку из курсора в PL/SQL
Igor Karmanov,

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

proc_str AM% ROWTYPE

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

....
stax
...
Рейтинг: 0 / 0
03.11.2021, 15:17
    #40108978
Igor Karmanov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как можно выполнить строку из курсора в PL/SQL
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
03.11.2021, 15:23
    #40108980
Igor Karmanov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как можно выполнить строку из курсора в PL/SQL
yens_gjytk,

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

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





тогда и

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

....
stax
...
Рейтинг: 0 / 0
03.11.2021, 15:27
    #40108984
Igor Karmanov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как можно выполнить строку из курсора в PL/SQL
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
03.11.2021, 15:28
    #40108985
yens_gjytk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как можно выполнить строку из курсора в PL/SQL
Igor Karmanov,

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

Огромное спасибо, заработало ! Я пробовал без кавычек в script ! ))
...
Рейтинг: 0 / 0
03.11.2021, 16:22
    #40109003
Igor Karmanov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как можно выполнить строку из курсора в PL/SQL
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
03.11.2021, 16:26
    #40109008
Igor Karmanov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как можно выполнить строку из курсора в PL/SQL
Выведу сюда весь скрипт, почистил от всего ненужного.

Код: 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
03.11.2021, 16:30
    #40109010
Asmodeus
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как можно выполнить строку из курсора в PL/SQL
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
03.11.2021, 16:33
    #40109011
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как можно выполнить строку из курсора в PL/SQL
Igor Karmanov,

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

ps
ой, копию CMS_RBRU.T_PE_COBJECT хоть сделайте, а то можно наменять с нашими советоми
.....
stax
...
Рейтинг: 0 / 0
03.11.2021, 16:38
    #40109016
Asmodeus
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как можно выполнить строку из курсора в PL/SQL
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
03.11.2021, 17:09
    #40109035
Igor Karmanov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как можно выполнить строку из курсора в PL/SQL
Stax, yens_gjytk, спасибо, убрал из UPDATE точку с запятой в конце, всё заработало! =)
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как можно выполнить строку из курсора в PL/SQL / 18 сообщений из 18, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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