sí lo es. Aquí una muestra donde el primer procedimiento almacenado quiere seleccionar de XALL_TABLES, pero si esta tabla no existe, seleccione de dual. Finalmente, como no tengo un objeto XALL_TABLES, el primer procedimiento almacenado selecciona desde dual. El segundo, hace lo mismo en el objeto ALL_TABLES. Como ALL_TABLES existe, el segundo procedimiento almacenado selecciona de all_tables pero no de DUAL.
Este tipo de construcción es útil cuando el paquete tiene que implementarse en toda su base de datos y usar tablas que no se implementan en todas partes ... (vale, tal vez haya un problema conceptual, pero sucede).
--conditionals compilation instructions accept only static condition (just with constants)
--passing sql bind variable doesn't work
--To pass a value to a conditional compilation instruction, I bypasses the use of input parameters of the script
--these 4 next lines affect a value to the first and the second input parameter of the script
--If your originally script use input script parameter, use the next free parameter ...
column param_1 new_value 1 noprint
select nvl(max(1), 0) param_1 from all_views where owner = 'SYS' and view_name = 'XALL_TABLES';
column param_2 new_value 2 noprint
select nvl(max(1), 0) param_2 from all_views where owner = 'SYS' and view_name = 'ALL_TABLES';
CREATE or replace PACKAGE my_pkg AS
function test_xall_tables return varchar2;
function test_all_tables return varchar2;
END my_pkg;
/
CREATE or replace PACKAGE BODY my_pkg AS
function test_xall_tables return varchar2 is
vch varchar2(50);
begin
$IF (&1 = 0) $THEN
select 'VIEW XALL_TABLES D''ONT EXISTS' into vch from dual;
$ELSE
select max('VIEW XALL_TABLES EXISTS') into vch from XALL_TABLES;
$END
return vch;
end test_xall_tables;
function test_all_tables return varchar2 is
vch varchar2(50);
begin
$IF (&2 = 0) $THEN
select 'VIEW ALL_TABLES D''ONT EXISTS' into vch from dual;
$ELSE
select max('VIEW ALL_TABLES EXISTS') into vch from ALL_TABLES;
$END
return vch;
end test_all_tables;
END my_pkg;
/
la prueba:
select my_pkg.test_xall_tables from dual;
dan
VISTA XALL_TABLES D'ONT EXISTE
select my_pkg.test_all_tables from dual;
dan
VISTA ALL_TABLES EXISTE
No creo que sea una buena idea, incluso si hubiera sido posible. Ahora su código pasará la compilación pero fallará (está diseñado para fallar) en tiempo de ejecución. Esa es una compensación que no tomaría a la ligera (pero, naturalmente, YMMV). – user272735
@ user272735: No necesariamente tiene que fallar, si tuviera otro código de trabajo, lo habría usado en lugar del mensaje de salida. Tengo un código de solución, pero se ejecuta desde un script SQL * Plus y como un usuario diferente. Estoy de acuerdo en que es arriesgado, mi idea era usarlo como una medida temporal para poder continuar con las pruebas, en lugar de esperar ... y esperar ... para recibir asistencia del DBA. Pensé que había visto trucos similares una vez en C, no estaba seguro de si podría hacer algo similar en PL/SQL. – FrustratedWithFormsDesigner
Tiene toda mi simpatía que puede disfrutar cuando está esperando ... y esperando ... Asistencia de DBA (he estado allí también, frustrante). Todo lo que te ayude a avanzar es bueno si _waste_ se reduce a largo plazo. Estoy seguro de que sabes cuán fácilmente esos hacks temporales se convierten en permanentes. – user272735