У меня проблема с PL / SQL:
Я пытаюсь написать оператор PL / SQL для расширения метрики Oracle Cloud Control. Метрике нужен КУРСОР в качестве результата:
PL / SQL должен заканчиваться примерно следующим образом
OPEN :1 FOR SELECT var1, var2 FROM DUAL;
Переменная связывания 1 и тип «SQL_CURSOR» определяются приложением.
Мой код выглядит так:
DECLARE
v_ts_id NUMBER;
tbspname VARCHAR2(200);
CURSOR all_tablespaces IS
select distinct tablespace_name
from dba_tablespaces
where tablespace_name not in ('UNDO','TEMP');
BEGIN
FOR v_ts_name IN all_tablespaces LOOP
tbspname := UPPER(v_ts_name.tablespace_name);
SELECT ts# into v_ts_id
FROM v$tablespace
where name = tbspname;
END LOOP;
OPEN :1 FOR SELECT v_ts_id, tbspname FROM DUAL;
END;
В результате получается одна строка. Имеет смысл, потому что курсор просто выбирает последние значения, хранящиеся в v_ts_id
и tbspname
.
Но как заставить курсор выделять все строки? Я не хочу создавать таблицу для хранения значений.
Следующие работы на SQL * Plus
set serverout on
set verify off
set lines 200
set pages 2000
DECLARE
v_ts_id number;
tbspname varchar2(200);
CURSOR all_tablespaces IS
select distinct tablespace_name
from dba_tablespaces
where tablespace_name not in ('UNDO','TEMP');
BEGIN
FOR v_ts_name IN all_tablespaces LOOP
tbspname := UPPER(v_ts_name.tablespace_name);
SELECT ts# into v_ts_id
FROM v$tablespace
where name = tbspname;
DBMS_OUTPUT.PUT_LINE(v_ts_id ||','||tbspname);
END LOOP;
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('Tablespace usage information not found in AWR');
END;
/
Часть РЕЗУЛЬТАТА выглядит так:
5,USERS
1,SYSAUX
0,SYSTEM
Я хочу получить тот же результат, что и во втором примере, возвращаемый курсором в моем коде?
Я считаю, что цикл незаменим, потому что позже для каждого табличного пространства будет обработано больше данных.
v$tablespace
сdba_tablespaces
? Вы действительно выполняете дополнительную обработку в цикле, который здесь не показан и который не работает с одним оператором SQL? - person Justin Cave   schedule 12.11.2019