Como poner una variable en el from
Intento hacer una query y en el apartado from quiero poner una variable, no me lo deja.
Alguna solución?
Muchas gracias
Alguna solución?
Muchas gracias
Hay que hacerlo con SQL dinámico.
Puedo mostrarte un ejemplo si quieres.
Puedo mostrarte un ejemplo si quieres.
Espero que estos ejemplos te ayudan.
Acabo de hallarlos.
Los creé hace mucho tiempo:
SQL> @dynamic3
SQL> --
SQL> -- More examples of dynamic SQL using EXECUTE IMMEDIATE:
SQL> --
SQL> DECLARE
2 TABLE_NAME VARCHAR2(30);
3 ROW_COUNT NUMBER;
4 BEGIN
5 TABLE_NAME := 'DBA_TABLES';
6 EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM '||TABLE_NAME INTO ROW_COUNT;
7 DBMS_OUTPUT.PUT_LINE(TABLE_NAME||' HAS '||ROW_COUNT||' ROWS');
8 END;
9 /
DBA_TABLES HAS 1108 ROWS
PL/SQL procedure successfully completed.
SQL> SELECT COUNT(*) FROM DBA_TABLES
2 /
COUNT(*)
----------
1108
SQL> DECLARE
2 TABLE_NAME VARCHAR2(30);
3 ROW_COUNT NUMBER;
4 CONDITION VARCHAR2(30);
5 BEGIN
6 TABLE_NAME := 'DBA_OBJECTS';
7 CONDITION := 'OBJECT_NAME LIKE ''A%''';
8 EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM '||TABLE_NAME||
9 ' WHERE '||CONDITION INTO ROW_COUNT;
10 DBMS_OUTPUT.PUT_LINE(TABLE_NAME||' HAS '||ROW_COUNT||' ROWS WHERE '||CONDITION);
11 END;
12 /
DBA_OBJECTS HAS 309 ROWS WHERE OBJECT_NAME LIKE 'A%'
PL/SQL procedure successfully completed.
SQL> SELECT COUNT(*) FROM DBA_OBJECTS
2 WHERE SUBSTR(OBJECT_NAME,1,1) = 'A'
3 /
COUNT(*)
----------
309
SQL> CREATE OR REPLACE FUNCTION TABCOUNT (
2 TAB IN VARCHAR2,
3 WHR IN VARCHAR2 := NULL)
4 RETURN PLS_INTEGER
5 IS
6 ROW_COUNT PLS_INTEGER;
7 BEGIN
8 EXECUTE IMMEDIATE
9 'SELECT COUNT(*) FROM '||TAB||
10 ' WHERE '||NVL(WHR,'1=1')
11 INTO ROW_COUNT;
12 RETURN ROW_COUNT;
13 END TABCOUNT;
14 /
Function created.
SQL> EXEC DBMS_OUTPUT.PUT_LINE(TABCOUNT('DBA_INDEXES'))
1306
PL/SQL procedure successfully completed.
SQL> /
Function created.
SQL> SELECT COUNT(*) FROM DBA_INDEXES
2 /
COUNT(*)
----------
1306
SQL> SELECT TABCOUNT('DBA_INDEXES','INDEX_NAME LIKE ''A%''') FROM DUAL
2 /
TABCOUNT('DBA_INDEXES','INDEX_NAMELIKE''A%''')
----------------------------------------------
15
SQL> SELECT COUNT(*) FROM DBA_INDEXES
2 WHERE SUBSTR(INDEX_NAME,1,1) = 'A'
3 /
COUNT(*)
----------
15
SQL>
Acabo de hallarlos.
Los creé hace mucho tiempo:
SQL> @dynamic3
SQL> --
SQL> -- More examples of dynamic SQL using EXECUTE IMMEDIATE:
SQL> --
SQL> DECLARE
2 TABLE_NAME VARCHAR2(30);
3 ROW_COUNT NUMBER;
4 BEGIN
5 TABLE_NAME := 'DBA_TABLES';
6 EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM '||TABLE_NAME INTO ROW_COUNT;
7 DBMS_OUTPUT.PUT_LINE(TABLE_NAME||' HAS '||ROW_COUNT||' ROWS');
8 END;
9 /
DBA_TABLES HAS 1108 ROWS
PL/SQL procedure successfully completed.
SQL> SELECT COUNT(*) FROM DBA_TABLES
2 /
COUNT(*)
----------
1108
SQL> DECLARE
2 TABLE_NAME VARCHAR2(30);
3 ROW_COUNT NUMBER;
4 CONDITION VARCHAR2(30);
5 BEGIN
6 TABLE_NAME := 'DBA_OBJECTS';
7 CONDITION := 'OBJECT_NAME LIKE ''A%''';
8 EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM '||TABLE_NAME||
9 ' WHERE '||CONDITION INTO ROW_COUNT;
10 DBMS_OUTPUT.PUT_LINE(TABLE_NAME||' HAS '||ROW_COUNT||' ROWS WHERE '||CONDITION);
11 END;
12 /
DBA_OBJECTS HAS 309 ROWS WHERE OBJECT_NAME LIKE 'A%'
PL/SQL procedure successfully completed.
SQL> SELECT COUNT(*) FROM DBA_OBJECTS
2 WHERE SUBSTR(OBJECT_NAME,1,1) = 'A'
3 /
COUNT(*)
----------
309
SQL> CREATE OR REPLACE FUNCTION TABCOUNT (
2 TAB IN VARCHAR2,
3 WHR IN VARCHAR2 := NULL)
4 RETURN PLS_INTEGER
5 IS
6 ROW_COUNT PLS_INTEGER;
7 BEGIN
8 EXECUTE IMMEDIATE
9 'SELECT COUNT(*) FROM '||TAB||
10 ' WHERE '||NVL(WHR,'1=1')
11 INTO ROW_COUNT;
12 RETURN ROW_COUNT;
13 END TABCOUNT;
14 /
Function created.
SQL> EXEC DBMS_OUTPUT.PUT_LINE(TABCOUNT('DBA_INDEXES'))
1306
PL/SQL procedure successfully completed.
SQL> /
Function created.
SQL> SELECT COUNT(*) FROM DBA_INDEXES
2 /
COUNT(*)
----------
1306
SQL> SELECT TABCOUNT('DBA_INDEXES','INDEX_NAME LIKE ''A%''') FROM DUAL
2 /
TABCOUNT('DBA_INDEXES','INDEX_NAMELIKE''A%''')
----------------------------------------------
15
SQL> SELECT COUNT(*) FROM DBA_INDEXES
2 WHERE SUBSTR(INDEX_NAME,1,1) = 'A'
3 /
COUNT(*)
----------
15
SQL>
