Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Кавычки в execute immediate / 22 сообщений из 22, страница 1 из 1
18.07.2018, 11:31
    #39675523
Synoptic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кавычки в execute immediate
Коллеги, доброго всем!

Тупейшый вопрос, но он поставил меня в тупик. Прошу помощи.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
begin
execute immediate '
declare
cursor c1 is
   select user u1 from dual;
   i c1%rowtype;
begin
  for i in c1 loop
    dbms_output.put_line(i.u1);
  end loop;
end;';
end;


На выходе поучаем, например Вася.

А как вывести "Имя пользователя = Вася?
Ну т.е. как вставить такую конструкцию внутриexecute immediate ?
Код: plsql
1.
dbms_output.put_line('Имя пользователя = '||i.u1);



Перепробовал кучу вариантов, но правильного не нашёл...
...
Рейтинг: 0 / 0
18.07.2018, 11:38
    #39675530
MaximaXXL
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кавычки в execute immediate
Synoptic,

Код: plsql
1.
2.
3.
4.
5.
select 'a' a, '''b' edge, 'a''b' middle  from dual


A	EDGE	MIDDLE
a	'b	a'b
...
Рейтинг: 0 / 0
18.07.2018, 11:40
    #39675532
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кавычки в execute immediate
RTFM Text Literals (FAQ)

Synoptic
Код: plsql
1.
i c1%rowtype;

Код-мусор.
...
Рейтинг: 0 / 0
18.07.2018, 11:40
    #39675534
-gt-
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кавычки в execute immediate
SynopticКоллеги, доброго всем!

Тупейшый вопрос, но он поставил меня в тупик. Прошу помощи.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
begin
execute immediate '
declare
cursor c1 is
   select user u1 from dual;
   i c1%rowtype;
begin
  for i in c1 loop
    dbms_output.put_line(i.u1);
  end loop;
end;';
end;


На выходе поучаем, например Вася.

А как вывести "Имя пользователя = Вася?
Ну т.е. как вставить такую конструкцию внутриexecute immediate ?
Код: plsql
1.
dbms_output.put_line('Имя пользователя = '||i.u1);



Перепробовал кучу вариантов, но правильного не нашёл...

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
SQL> begin
  2      execute immediate q'[
  3          begin
  4              dbms_output.put_line('Вася = ' || 1);
  5          end;]';
  6  end;
  7  /

Вася = 1

PL/SQL procedure successfully completed


SQL> 
...
Рейтинг: 0 / 0
18.07.2018, 12:07
    #39675554
Synoptic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кавычки в execute immediate
MaximaXXLSynoptic,

Код: plsql
1.
2.
3.
4.
5.
select 'a' a, '''b' edge, 'a''b' middle  from dual


A	EDGE	MIDDLE
a	'b	a'b

Спасибо, но вопрос не в этом.

ElicКод-мусор.
Ещё хотел написать, чтобы не смотрели на курсор, ибо пример пустой и акцент на другом ))

Elic
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
SQL> begin
  2      execute immediate q'[
  3          begin
  4              dbms_output.put_line('Вася = ' || 1);
  5          end;]';
  6  end;
  7  /

Вася = 1

PL/SQL procedure successfully completed


SQL> 

Спасибо огромное! Совсем забыл про оператор q
...
Рейтинг: 0 / 0
18.07.2018, 12:12
    #39675559
merch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кавычки в execute immediate
SynopticСпасибо огромное! Совсем забыл про оператор q


Код: plsql
1.
2.
3.
4.
5.
set serveroutput on
begin
    execute immediate 'begin dbms_output.put_line(''Вася = '' || 1); end;';
end;
/
...
Рейтинг: 0 / 0
18.07.2018, 18:34
    #39675823
IMNO
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кавычки в execute immediate
ElicRTFM Text Literals (FAQ)

Synoptic
Код: plsql
1.
i c1%rowtype;

Код-мусор.

Если Вы имели ввиду название переменной, то согласен, что не круто.
Если Вы имели ввиду объявление переменной курсорного типа, то например в том же Ферштейне такое сплошь и рядом встречается в примерах. Я так никогда не писал, и удивился, когда увидел такое в авторитетной книге. Думал, что так не пишут, а тут вот оно что.
...
Рейтинг: 0 / 0
18.07.2018, 18:46
    #39675831
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кавычки в execute immediate
IMNOЕсли Вы имели ввиду название переменной, то согласен, что не круто.
Он имел ввиду, что все объявление переменной "i" в данном случае - мусор, ибо не используется.
...
Рейтинг: 0 / 0
18.07.2018, 18:47
    #39675832
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кавычки в execute immediate
IMNOЕсли Вы имели ввиду объявление переменной курсорного типа,Типа "запись". Не имеющее смысла.
IMNOто например в том же Ферштейне такое сплошь и рядом встречается в примерах. Я так никогда не писал, и удивился, когда увидел такое в авторитетной книге. Думал, что так не пишут, а тут вот оно что.Продемонстрируй цитатой с указанием источника, чтобы можно было убедиться, что ты не увидел в книге фигу.
...
Рейтинг: 0 / 0
18.07.2018, 19:19
    #39675848
IMNO
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кавычки в execute immediate
andrey_anonymousIMNOЕсли Вы имели ввиду название переменной, то согласен, что не круто.
Он имел ввиду, что все объявление переменной "i" в данном случае - мусор, ибо не используется.

Ой. Недопонимание.

Я имею ввиду, что не понимаю этих "фишек" с переменными курсорного типа и вообще с явными курсорами.
То есть, например, я часто пользуюсь:
Код: plsql
1.
2.
a TableName%ROWTYPE
b TableName.ColumnName%TYPE


но зачем мне объявлять сначала явный курсор, а потом ещё переменную с типом этого курсора, когда я могу сделать так:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
FOR rec IN(SELECT c, d
           FROM TableName)
LOOP
...
n = rec.c;
m = rec.d;
...
END LOOP;


И кода меньше, и не надо постоянно скролить в начало пакета, чтобы посмотреть, что там в селекте написано.


Примеры из книги "Фейерштейн С., Прибыл Б. - Oracle PL-SQL для профессионалов." 6 издание

1.
Глава 5. Циклы
Подзаголовок "Примеры цикла FOR с курсором"
Страница 124

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
DECLARE
  CURSOR occupancy_cur IS
    SELECT pet_id, room_number
    FROM occupancy WHERE occupied_dt = TRUNC(SYSDATE);
    
    occupancy_rec occupancy_cur%ROWTYPE;
BEGIN
  OPEN occupancy_cur;
  
  LOOP
    FETCH occupancy_cur INTO occupancy_rec;
    
    EXIT WHEN occupancy_cur%NOTFOUND;
    
    update_bill(occupancy_rec.pet_id, occupancy_rec.room_number);
  END LOOP;
 
  CLOSE occupancy_cur;
END;



2.
Глава 7. Работа с данными в программах
Подзаголовок "Привязка к курсорам и таблицам"
Страница 176

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
DECLARE
  CURSOR book_cur IS
    SELECT author, title FROM book
    WHERE isbn = '1-56592-335-9';
    
    l_book book_cur%ROWTYPE;
BEGIN
  OPEN book_cur;
  FETCH book_cur INTO l_book; 
END;
...
Рейтинг: 0 / 0
18.07.2018, 19:28
    #39675852
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кавычки в execute immediate
IMNOОй. Недопонимание.
Я имею ввиду, что не понимаю этих "фишек" с переменными курсорного типа и вообще с явными курсорами.

Когда дойдете - поймете.
К примеру, без объявления типа record и коллекции на его основе будет достаточно сложно реализовать конструкции вида fetch-bulk collect-limit (с возможным последующим переходом в forall) или pipe row() для конвейерной функции-фильтра.

Что до книжки, то уважаемый г-н Ферштейн в своем учебном пособии демонстрирует Вам возможности языка, а не единственно-верный-потому-что-истинный (с) подход.
...
Рейтинг: 0 / 0
18.07.2018, 19:30
    #39675855
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кавычки в execute immediate
IMNOс переменными курсорного типа и вообще с явными курсорами.
...переменную с типом этого курсора...
Вы бы это... разобрались кто на ком стоял... "переменная с типом курсора"
...
Рейтинг: 0 / 0
19.07.2018, 05:56
    #39675960
Synoptic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кавычки в execute immediate
IMNOЕсли Вы имели ввиду название переменной, то согласен, что не круто.
Если Вы имели ввиду объявление переменной курсорного типа, то например в том же Ферштейне такое сплошь и рядом встречается в примерах. Я так никогда не писал, и удивился, когда увидел такое в авторитетной книге. Думал, что так не пишут, а тут вот оно что.
Имя переменной - от балды, т.к. вопрос был в другом.

IMNOЯ имею ввиду, что не понимаю этих "фишек" с переменными курсорного типа и вообще с явными курсорами.
То есть, например, я часто пользуюсь:
Код: plsql
1.
2.
a TableName%ROWTYPE
b TableName.ColumnName%TYPE


но зачем мне объявлять сначала явный курсор, а потом ещё переменную с типом этого курсора, когда я могу сделать так:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
FOR rec IN(SELECT c, d
           FROM TableName)
LOOP
...
n = rec.c;
m = rec.d;
...
END LOOP;


И кода меньше, и не надо постоянно скролить в начало пакета, чтобы посмотреть, что там в селекте написано.

Когда запросы на пару экранов, вынесение его в курсор как раз таки улучшает читаемость кода.
...
Рейтинг: 0 / 0
19.07.2018, 07:31
    #39675978
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кавычки в execute immediate
SynopticКогда запросы на пару экранов, вынесение его в курсор как раз таки улучшает читаемость кода.Во-первых, ты, невежда, имеешь наглость критиковать, не понимая, что критикуешь.
Во-вторых, пару экранов - это само по себе плохо и нет разницы, где они мылят глаз.
В-третьих, да, явные курсоры - вещь нечасто полезная.
...
Рейтинг: 0 / 0
19.07.2018, 17:35
    #39676386
Synoptic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кавычки в execute immediate
ElicSynopticКогда запросы на пару экранов, вынесение его в курсор как раз таки улучшает читаемость кода.Во-первых, ты, невежда, имеешь наглость критиковать, не понимая, что критикуешь.
Во-вторых, пару экранов - это само по себе плохо и нет разницы, где они мылят глаз.
В-третьих, да, явные курсоры - вещь нечасто полезная.Корона не давит?
...
Рейтинг: 0 / 0
19.07.2018, 17:37
    #39676390
booby
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кавычки в execute immediate
ElicSynopticКогда запросы на пару экранов, вынесение его в курсор как раз таки улучшает читаемость кода.Во-первых, ты, невежда, имеешь наглость критиковать, не понимая, что критикуешь.

У меня стойкое впечатление, что квалифицированное мнение с цитированием непонятых читателем текстов,
высказывал совсем другой человек.

ElicВо-вторых, пару экранов - это само по себе плохо и нет разницы, где они мылят глаз.

Имхо, запрос - это программа на декларативном языке программирования.
Нет никаких причин, по которой она не может (или не должна) занимать хоть двести двадцать два десятка экранов.
В пределах возможностей компилятора, превращающего такой текст в выполняемую программу.
(В отличие от программ, написанных с использованием языков другого типа.)
И вариант инкапсуляции через представление, сам по себе, не является и не может являться гарантом
заранее предустановленного количества экранов для теста такой программы.
То есть, многоэкранный текст запроса, это естественно.
Потому не может быть признано за плохо.
И, раз ярлык "плохо" на запрос по критерию его размера не навешивается,
конструктивный способ обхождения с его текстом,
не создающий помехи для просмотра тела текста клиента этого курсора , имеет право существовать сам по себе.
И вот это - хорошо.

ElicВ-третьих, да, явные курсоры - вещь нечасто полезная.
С этим трудно не согласиться.
Переиспользуемый код - вещь, действительно, исключительно штучного, редкого и не нужного для всех применения.
Хорошо это или плохо - другой разговор.
Но да, по настоящему мощные вещи полезны крайне редко.
...
Рейтинг: 0 / 0
19.07.2018, 17:43
    #39676395
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кавычки в execute immediate
boobyярлык "плохо"Мировой заговор не чудится?
...
Рейтинг: 0 / 0
19.07.2018, 18:04
    #39676410
booby
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кавычки в execute immediate
Elicboobyярлык "плохо"Мировой заговор не чудится?
кхм. мне трудно развернуть эту скорлупу.

В том смысле, как вообще страшно жить жизнью программиста - нет не чудится.
Я такой жизнью добровольно живу, не дрожа от страха перед собственным существованием в мире программ,
и даже программ, размера больше двух экранов.

В том смысле, в каком заговор - результат чьего-то враждебного планирования - тоже не чудится.
Считать заговором, да еще мировым, мнение о двух экранах - мне смешно.
Если и есть в программировании заговор, то, например, в том, что десятки миллионов людей пишут на языках,
разработанных и/или развиваемых где-то в Калифорнии.
Но это совсем другая история и другой заговор.

О чем-то третьем я догадаться не сумел.
...
Рейтинг: 0 / 0
19.07.2018, 18:59
    #39676446
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кавычки в execute immediate
boobyВ том смысле, в каком заговор - результат чьего-то враждебного планирования - тоже не чудится.Абсент?
...
Рейтинг: 0 / 0
19.07.2018, 20:50
    #39676485
booby
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кавычки в execute immediate
ElicboobyВ том смысле, в каком заговор - результат чьего-то враждебного планирования - тоже не чудится.Абсент?
Это уныло.
Вот не искал бы ты вокруг себя быдла, так и сам не стал бы небыдлом.
...
Рейтинг: 0 / 0
20.07.2018, 07:30
    #39676588
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кавычки в execute immediate
boobyЭто уныло.На ПТ веселее. - Вали.
...
Рейтинг: 0 / 0
20.07.2018, 14:59
    #39676956
booby
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кавычки в execute immediate
Elic... - Вали.
Всего доброго.
Ты это, ... береги себя.
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Кавычки в execute immediate / 22 сообщений из 22, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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