понедельник, 12 августа 2013 г.

Использование новых типов данных в SQL из PL/SQL

В Oracle 12c появилась возможность в SQL, вызываемом из PL/SQL использовать новые типы данных:
  • BOOLEAN
  • табличные типы, объявленные в спецификации пакета
  • ассоциативные массивы (index by)
Документация

Пример: create or replace package tst is TYPE tpt IS TABLE OF VARCHAR2(100); TYPE tpt_indexed IS TABLE OF VARCHAR2(100) INDEX BY BINARY_INTEGER; PROCEDURE p; PROCEDURE p2; PROCEDURE p3; FUNCTION f(a BOOLEAN) RETURN VARCHAR2; end tst; / create or replace package body tst is t1 tpt; t1_ind tpt_indexed; PROCEDURE p IS i NUMBER; BEGIN t1 := tpt('table type 1', 'table type 2'); FOR rec IN (SELECT VALUE(t) t FROM TABLE(t1) t) LOOP dbms_output.put_line(rec.t); END LOOP; END; PROCEDURE p2 IS i NUMBER; BEGIN t1_ind(1) := 'table index by - 1'; t1_ind(2) := 'table index by - 2'; FOR rec IN (SELECT VALUE(t) t FROM TABLE(t1_ind) t) LOOP dbms_output.put_line(rec.t); END LOOP; END; FUNCTION f(a BOOLEAN) RETURN VARCHAR2 IS BEGIN IF a THEN RETURN 'param is true'; ELSE RETURN 'param is false'; END IF; END; PROCEDURE p3 IS i1 VARCHAR2(20); i2 VARCHAR2(20); BEGIN EXECUTE IMMEDIATE 'SELECT tst.f(:p1), tst.f(:p2) FROM dual' INTO i1, i2 USING 1=1, 1=0; dbms_output.put_line(i1); dbms_output.put_line(i2); END; end tst; BEGIN tst.p; tst.p2; tst.p3; END; / Results: table type 1 table type 2 table index by - 1 table index by - 2 param is true param is false /

Комментарии
  1. Определение типа должно находится в спецификации. В теле не работает
  2. Что бы передать boolean необходимо использовать EXECUTE IMMEDIATE - USING

Комментариев нет: