БОЛЬШОЙ СОБИРАЙТЕ INTO и просто INTO внутри одного блока sql - PullRequest
0 голосов
/ 10 апреля 2019

У меня есть блок SQL внутри моей хранимой процедуры PL / SQL. Этот блок использует массовый сбор для сбора значений в определенный пользователем тип.

TYPE risks IS TABLE OF NUMBER;
o_risks risks;

... 

SELECT DISTINCT risk
BULK   COLLECT
INTO   o_risks
FROM   schema.risks
WHERE parent_id = any_id

Но я также хочу сохранить max(other_column_name) из этого блока SQL в числовую переменную. Возможно ли это при использовании BULK COLLECT? Конечно, я мог бы просто создать еще один блок, но он выглядит не так.

1 Ответ

3 голосов
/ 10 апреля 2019

Использование CAST и COLLECT:

Установка Oracle :

CREATE TYPE risks IS TABLE OF NUMBER;
/

CREATE TABLE risk_table ( risk, other_column_name, parent_id ) AS
SELECT 1, 1, 1 FROM DUAL UNION ALL
SELECT 3, 2, 1 FROM DUAL UNION ALL
SELECT 1, 4, 1 FROM DUAL UNION ALL
SELECT 2, 2, 1 FROM DUAL UNION ALL
SELECT 3, 1, 1 FROM DUAL UNION ALL
SELECT 3, 2, 1 FROM DUAL UNION ALL
SELECT 4, 5, 2 FROM DUAL;

PL / SQL :

DECLARE
  o_risks             risks;
  o_other_column_name RISK_TABLE.OTHER_COLUMN_NAME%TYPE;
  any_id              RISK_TABLE.PARENT_ID%TYPE := 1;
BEGIN
  SELECT CAST( COLLECT( DISTINCT risk ) AS risks ),
         MAX( other_column_name )
  INTO   o_risks, o_other_column_name
  FROM   risk_table
  WHERE  parent_id = any_id;

  DBMS_OUTPUT.PUT_LINE( 'Max other column name: ' || o_other_column_name );
  FOR i IN 1 .. o_risks.COUNT LOOP
    DBMS_OUTPUT.PUT_LINE( 'Risk ' || i || ': ' || o_risks(i) );
  END LOOP;
END;
/

выход

Max other column name: 4
Risk 1: 1
Risk 2: 2
Risk 3: 3

дБ <> скрипка здесь

Если вы используете версию, в которой COLLECT( DISTINCT ... ) не работает, вы можете использовать SET( CAST( COLLECT( risk ) AS risks ) ) для получения различных значений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...