Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 DBMS_SQL.VARCHAR2S получить длину  [new]
beg!ner
Member

Откуда: Незалэжна Рохляндия
Сообщений: 48
привет всем! Как получить количество элементов в переменной типа DBMS_SQL.VARCHAR2S?
просто глянул на это пример:
CREATE OR REPLACE PROCEDURE proc1(p_strarr DBMS_SQL.VARCHAR2S) AS
BEGIN
  FOR i IN 1..p_strarr.COUNT LOOP
    dbms_output.put_line('Array element '|| i ||' = ['|| p_strarr(i) ||']');
  END LOOP;
END;
/
-- Test it...
SET SERVEROUTPUT ON
DECLARE
  v_strarr DBMS_SQL.VARCHAR2S;
BEGIN
  v_strarr(1) := 'val1';
  v_strarr(2) := 'val2';
  v_strarr(3) := 'val3';
  proc1(v_strarr);
END;
/
функция COUNT работет в цикле, но не работает, если я вызываю это как:

Select p_strarr.COUNT from dual;
пишет
PL/SQL: ORA-00904: "p_strarr.COUNT": invalid identifier

Подскажите плиз, что неправильно делаю?
15 июл 08, 14:21    [5936389]     Ответить | Цитировать Сообщить модератору
 Re: DBMS_SQL.VARCHAR2S получить длину  [new]
Elic
Member

Откуда:
Сообщений: 29979
beg!ner
Select p_strarr.COUNT from dual;
PL/SQL: ORA-00904: "p_strarr.COUNT": invalid identifier

Подскажите плиз, что неправильно делаю?
Пытаешься вызывать метод коллекции в SQL-е.
Присвой сперва это значение какой-нибудь переменной. Но и это всё равно будет неправильно :)
15 июл 08, 14:30    [5936451]     Ответить | Цитировать Сообщить модератору
 Re: DBMS_SQL.VARCHAR2S получить длину  [new]
beg!ner
Member

Откуда: Незалэжна Рохляндия
Сообщений: 48
А есть ли другой способ получить длину колекции в теле SQL скрипта?
15 июл 08, 14:38    [5936523]     Ответить | Цитировать Сообщить модератору
 Re: DBMS_SQL.VARCHAR2S получить длину  [new]
Elic
Member

Откуда:
Сообщений: 29979
beg!ner
А есть ли другой способ получить длину колекции в теле SQL скрипта?
Что такое "SQL скрипт"? RTFM
Коллекции бывают только в PL/SQL. Вот в PL/SQL и надо получать их "длину".
15 июл 08, 15:07    [5936723]     Ответить | Цитировать Сообщить модератору
 Re: DBMS_SQL.VARCHAR2S получить длину  [new]
beg!ner
Member

Откуда: Незалэжна Рохляндия
Сообщений: 48
Спасибо, а вот еще вопрос: почему в данном случае выбирается city с одним и тем же индексом, ведь dbms_random.value(0, 2) должен брать значения из диапазона 0..2?

CREATE TABLE SCOTT.TABLE1
(
  ID NUMBER(10,0),
  "NAME" CHAR(50)
);

delete from scott.table1;
declare
  city DBMS_SQL.VARCHAR2S;
BEGIN
     city(0) := 'New York';
     city(1) := 'Ridgefield';
     city(2) := 'Beverly Hills';

     insert into scott.table1(
     select round(dbms_random.value(0, 2)), city(round(dbms_random.value(0, 2))) from dual
     CONNECT BY LEVEL<=10
     );
END;
/
Select * from scott.Table1;
15 июл 08, 18:27    [5937997]     Ответить | Цитировать Сообщить модератору
 Re: DBMS_SQL.VARCHAR2S получить длину  [new]
Elic
Member

Откуда:
Сообщений: 29979
beg!ner
почему в данном случае выбирается city с одним и тем же индексом, ведь dbms_random.value(0, 2) должен брать значения из диапазона 0..2?
declare
  city DBMS_SQL.VARCHAR2S;
BEGIN
     select  city(round(dbms_random.value(0, 2)))
Потому что элемент коллекции вычисляется до выполнения запроса и передаётся в запрос как bind-переменная. Которая для запроса суть константа, хоть и разная при последующих выполнениях этого "кода"
15 июл 08, 18:41    [5938048]     Ответить | Цитировать Сообщить модератору
 Re: DBMS_SQL.VARCHAR2S получить длину  [new]
beg!ner
Member

Откуда: Незалэжна Рохляндия
Сообщений: 48
спасибо, а существует ли решение для такого случая передачи параметров?
15 июл 08, 19:07    [5938109]     Ответить | Цитировать Сообщить модератору
 Re: DBMS_SQL.VARCHAR2S получить длину  [new]
Elic
Member

Откуда:
Сообщений: 29979
beg!ner
спасибо, а существует ли решение для такого случая передачи параметров?
Естественно "решения" нет, поскольку такого "случая" не бывает :)
Но есть другие способы.
  TRecs is table of scott.table1%rowtype;
  Recs TRecs;
  for i in 1..10 loop /* догадайся сам */ end loop;
  forall i in 1..Recs.count
    insert into scott.table1 values Recs(i);
Но всё зависит от того, не пытаешься ли ты почесать передней пяткой заднее ухо
15 июл 08, 19:18    [5938124]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить