Not all dynamic sql is strictly for immediate execution, nor is it dirty (I needed aninteresting title). I learnt this tricks from my friend at work, he's a big believer of using sql to code generate more sql.
Altering column length
You'll still get an error when running the generated sql if you try to shrink a column.
SELECT 'ALTER TABLE ' || table_name || ' MODIFY ' || column_name || ' VARCHAR2(' || CASE column_name WHEN 'FOO' THEN '10' ELSE '20' END || ');' AS sql FROM user_tab_columns WHERE column_name IN ( 'FOO','BAR') AND table_name IN (SELECT table_name FROM user_tables) AND NOT regexp_like(table_name, '_(NEW|BAK)$') -- exclude backups
Inserting output from dynamic sql
Normally you'd expect to get away with using something like SELECT blah INTO v_foo
, but with dynamic sql you need place the INTO
in the EXECUTE IMMEDIATE
statement.
SET SERVEROUTPUT ON DECLARE v_sql VARCHAR2(8000); v_count NUMBER; CURSOR c_tables IS SELECT table_name FROM user_tables; BEGIN FOR rec in c_tables LOOP v_sql := 'SELECT count(*) FROM ' || rec.table_name; EXECUTE IMMEDIATE v_sql INTO v_count; DBMS_OUTPUT.put_line(rec.table_name || ' has ' || v_count); END LOOP; END; /
Using substitution variables
clear screen set serveroutput on declare cursor c_tables is select table_name from user_tables; v_data VARCHAR2(2000); v_sql VARCHAR2(2000); v_stuff VARCHAR2(50) := '&1'; -- try entering MAX(DATADATE) or COUNT(*) begin for rec in c_tables loop v_sql := 'SELECT TO_CHAR(' || v_stuff || ') FROM ' || rec.table_name; begin execute immediate v_sql into v_data; dbms_output.put_line(rec.table_name || ': ' || v_data); exception when others then dbms_output.put_line('failed to run: ' || v_sql); raise; end; end case; end loop; end; /
One liners
Grants
SELECT 'GRANT ' || privilege || ' ON "' || GRANTOR ||'"."' || TABLE_NAME || '" TO "' || GRANTEE || '";' FROM dba_tab_privs WHERE grantor = 'FOO' AND grantee = 'BAR' ;
Recreating synonyms as sys
select 'CREATE OR REPLACE SYNONYM "' || OWNER || '"."' || SYNONYM_NAME || '" FOR "' || TABLE_OWNER || '"."' || TABLE_NAME || '";' from dba_synonyms where table_owner = 'FOO';
Top comments (0)