No Oracle Database 12c, foi introduzida uma nova funcionalidade, o SQL Text Expansion. E na package DBMS_UTILITY, foi adicionada a procedure EXPAND_SQL_TEXT.
SQL> variable retornoclob SQL> begin dbms_utility.expand_sql_text( input_sql_text => 'select * from emp', output_sql_text=> :retorno ); end; / PL/SQL procedure successfully completed. SQL> print retorno RETORNO ------------------------------------------------------------------------------- SELECT "A1"."EMPNO" "EMPNO","A1"."ENAME" "ENAME","A1"."JOB" "JOB","A1"."MGR" "MGR","A1"."HIREDATE" "HIREDATE","A1"."SAL" "SAL","A1"."COMM" "COMM","A1"."DEPTNO""DEPTNO" FROM "SCOTT"."EMP" "A1"
Vamos verificar o efeito com uma política de VPD:
SQL> SELECT count(*) FROM emp e, dept d WHERE d.deptno = e.deptno; COUNT(*) --------- 14
Criando a política de VPD, para mostrar apenas os dados referentes ao departamento 30:
SQL> CREATE OR REPLACE FUNCTION hide_sal_comm ( v_schema IN VARCHAR2, v_objname IN VARCHAR2) RETURN VARCHAR2 AS con VARCHAR2 (200); BEGIN con := 'deptno=30'; RETURN (con); END hide_sal_comm; / Function created. SQL> BEGIN DBMS_RLS.ADD_POLICY ( object_schema => 'scott', object_name => 'emp', policy_name => 'hide_sal_policy', policy_function => 'hide_sal_comm'); END; / PL/SQL procedure successfully completed. SQL> SELECT count(*) FROM emp e, dept d WHERE d.deptno = e.deptno; COUNT(*) ---------- 6
Verificando o SQL gerado:
SQL> variable retornoclob
SQL> begin dbms_utility.expand_sql_text(;input_sql_text=> 'SELECT count(*) FROM empe,depd WHEREd.deptno = e.deptno', output_sql_text => :retorno ); end; / PL/SQL procedure successfully completed. SQL> print retorno RETORNO -------------------------------------------------------------------------------- SELECT COUNT(*) "COUNT(*)" FROM (SELECT "A3"."EMPNO" "EMPNO","A3"."ENAME" "ENAME","A3"."JOB" "JOB","A3"."MGR" "MGR","A3"."HIREDATE" "HIREDATE","A3"."SAL" "SAL","A3"."COMM" "COMM","A3"."DEPTNO" "DEPTNO" FROM "SCOTT"."EMP" "A3" WHERE "A3"."DEPTNO"=30) "A2","SCOTT"."DEPT" "A1" WHERE "A1"."DEPTNO"="A2"."DEPTNO"
Abraço
Alex Zaballa, formado em Análise de Sistemas, é especialista em Banco de Dados Oracle com sólidos conhecimentos em Servidores de Aplicação e Sistemas Operacionais; trabalha com Oracle há 15 anos, é ORACLE ACE Director, certificado OCM Database 11G / Cloud e conta com mais de 140 outras certificações em produtos da Oracle. Alex também é um dos fundadores do Grupo de Usuários Oracle de Angola (GUOA), participa do Grupo de Usuários de Tecnologia Oracle Brasil (GUOB) e é membro do time OraWorld.