powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Передача таблицы в динамический SQL
9 сообщений из 9, страница 1 из 1
Передача таблицы в динамический SQL
    #32151506
AndrewS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ora 9.2.0.2, Win2000.
Как можно заставить нечто подобное работать:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
create or replace type ttbl_number is table of number;

declare
	nums	ttbl_number:= ttbl_number();
	sSql	long:= 'begin :tbl.extend; :tbl(:tbl.last):= 44; end;';
begin
	execute immediate sSql
	  using in out nums;
end;

ORA- 06550 : line  1 , column  7 :
PLS- 00110 : bind variable 'TBL.EXTEND' not allowed in this context
ORA- 06512 : at line  5 

Спасибо
...
Рейтинг: 0 / 0
Передача таблицы в динамический SQL
    #32151535
Фотография Oracle X-pert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Verno,
"tbl.extend" govorit, chto razmer stack of object "tbl" nado uvelichit' na 1.
t.e. extend - zarezervirovannoe slovo
pri ispol'zovanii pointera { ... is table of ... } eto ne obyazatel'no.
I gde y tebya opredeleno , chto takoe 'tbl'?
I chto ge ty hochesh??
+++
2 All
Konkretnyi vopros vernet conkretnyi otvet.
...
Рейтинг: 0 / 0
Передача таблицы в динамический SQL
    #32151577
AndrewS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне нужно передать таблицу в динамический код, заполнить ее там и вернуть ее обратно.
...
Рейтинг: 0 / 0
Передача таблицы в динамический SQL
    #32151594
Фотография Oracle X-pert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Togda dai primer svoego ".. в динамический код, заполнить ее там ",
ne boisya.
"Raspal'zovka i gadanie po ryke " v programmirovanii ne privetstvyutsya..
...
Рейтинг: 0 / 0
Передача таблицы в динамический SQL
    #32151624
AndrewS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подробнее, так подробнее. Есть тул, выполняющий набор тестов по схеме:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
procedure Test_Shell
(	p_nTestID	integer
,	p_sMode		varchar2
,	p_dStrt		date
,	p_dStop		date
) is
	lngFullText	long;
	lngSqlText	long;
begin
  select sql_text
    into lngSqlText
    from test
   where test.id = p_nTestID;
  lngFullText:= 'declare ' || lngSqlText || 'begin Test( :sMode, :dStrt, :dStop, :sErrLvl, :nErrCode, :sErrName, :tblDetails); end;' ;
  execute immediate lngFullText
    using in p_sMode
    , in p_dStrt
    , in p_dStop
    , out sErrLvl
    , out nErrCodeCurr
    , out sErrName
    , out tblDetails
   ;
end;

Текст процедуры Test, собственно выполняющей тест формируется динамически экспертом, а тул в определенное время вызывает эту процедуру, например:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
procedure Test
( p_sMode varchar2
, p_dStrt date
, p_dStop date
, p_sErrLvl out varchar2
, p_nErrCode out number
, p_sErrName out varchar2
, p_tblDetails out ttbl_string
) is
  nCnt	int;
begin
  select count(*) into nCnt from emp;
   if nCnt <  50  then
     nErrCode:=  1 ;
     sErrLvl:= 'R';
     sErrName:= 'Low EMP count';
   end if;
   p_sErrLvl:= sErrLvl;
   p_nErrCode:= nErrCode;
   p_sErrName:= sErrName;
     -- Здесть должно быть заполнение таблицы p_tblDetails всякими сообщениями
 
end Test;

В теле процедуры должна заполнятся сводная отчетная таблица, которая после выполнения теста отсылается по почте. Вся схема работает отлично, кроме передачи таблицы строк (tblDetails). Ее можно заменить на передачу какого-нибудь varchar2(4000) или clob, но придется переделывать в других местах довольно много работающего кода.
...
Рейтинг: 0 / 0
Передача таблицы в динамический SQL
    #32151710
Фотография Oracle X-pert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
create or replace procedure forum_Test
( p_sMode In varchar2
, p_dStrt In date
, p_dStop In date
, p_sErrLvl in out nocopy varchar2
, p_nErrCode in out nocopy number
, p_sErrName in out nocopy varchar2
, p_tblDetails in out nocopy DBMS_SQL.Varchar2S
) is
nCnt int;
curr_pos Integer;
begin
select count(*) into nCnt from emp;
if nCnt < 50 then
p_nErrCode := 1;
p_sErrLvl := 'R';
p_sErrName:= 'Low EMP count';
end if;
-- ?????? ?????? ???? ?????????? ??????? p_tblDetails ??????? ???????????
curr_pos := p_tblDetails.Count;
p_tblDetails(curr_pos + 1) := '?????? ?????? ???? ?????????? ??????? p_tblDetails ??????? ???????????';
end forum_Test;


procedure Test_Shell
( p_nTestID integer
, p_sMode varchar2
, p_dStrt date
, p_dStop date
) is
lngFullText long;
lngSqlText long;
sErrLvl
nErrCodeCurr
sErrName
tblDetails DBMS_SQL.Varchar2S;
begin
select sql_text
into lngSqlText
from test
where test.id = p_nTestID;
lngFullText:= 'declare ' || lngSqlText || 'begin Test( :sMode, :dStrt, :dStop, :sErrLvl, :nErrCode, :sErrName, :tblDetails); end;' ;
execute immediate lngFullText
using in p_sMode
, in p_dStrt
, in p_dStop
, out sErrLvl
, out nErrCodeCurr
, out sErrName
, out tblDetails
;
end;
...
Рейтинг: 0 / 0
Передача таблицы в динамический SQL
    #32151788
AndrewS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Переделал всё на dbms_sql.varchar2s. Ругается на:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
execute immediate lngFullText
  using in p_sMode
  , in p_dStrt
  , in p_dStop
  , out sErrLvl
  , out nErrCodeCurr
  , out sErrName
  , out tblDetails
;
Compilation errors for PACKAGE BODY ...:

Error: PLS- 00457 : expressions have to be of SQL types
Line:  1252 
Text: , out tblDetails

Error: PL/SQL: Statement ignored
Line:  1245 
Text: execute immediate lngFullText
...
Рейтинг: 0 / 0
Передача таблицы в динамический SQL
    #32151808
Фотография Oracle X-pert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sorry, ne proveril srazy...
T.k.
{ As a rule, dynamic SQL does not support PL/SQL-specific types. So, for example, define variables and bind arguments cannot be Booleans or index-by tables. The only exception is that a PL/SQL record can appear in the INTO clause.}
to::

A.Create type as object .
B. Replace dbms_sql.Varchar2S with this object
...
Рейтинг: 0 / 0
Передача таблицы в динамический SQL
    #32151888
AndrewS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вроде что-то заработало.

Спасибо.
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Передача таблицы в динамический SQL
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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