How can I get the create table command which is used to create a table in oracle 11g so that I can copy the command and run it in another database? Please help.
select dbms_metadata.get_ddl('TABLE', 'YOUR_TABLE_NAME_GOES_HERE')
from dual;
Try to spool the output of the below query,
SELECT DBMS_METADATA.GET_DDL('TABLE',u.table_name)
FROM USER_TABLES u;
Like,
set pagesize 0
set long 90000
set feedback off
set echo off
spool schema.sql
SELECT DBMS_METADATA.GET_DDL('TABLE',u.table_name)
FROM USER_TABLES u WHERE TABLE_NAME = '<your_table>';
spool off;
Reference: http://www.dba-oracle.com/oracle_tips_dbms_metadata.htm
Please use the below Query
select dbms_metadata.get_ddl('TABLE','YOUR_TABLE_NAME','YOUR_SCHEMA_NAME') from dual;
if you use SQL Developer, select the table name , and right click to choose Open Declaration and then Click SQL tab on the window that opens!
Related
I have 50 databases.
All the table schema in all the databases are the same. If I have a new column to be added to one table, I will have to run 50 times to update in all databases. This is very difficult all the time.
Is there an editor for postgres where there is a way to execute a query in all databases?
Currently, I am using dbeaver. I have to change the connection all the time and execute the query. Please help.
Example: I had to alter a table by adding a column.
ALTER TABLE table-name ADD new-column-name column-definition;
It is very difficult to execute for 50 databases.
For executing this answer, you need to have dblink extension.
DO $$
DECLARE
i text;
BEGIN
FOR i in SELECT datname FROM pg_database
LOOP
EXECUTE 'select * from dblink(''host=localhost
user=postgres
password=postgres
dbname='||i||' port=5432'',''ALTER TABLE table-name ADD new-column-name column-definition'' ) tt(
updated text)'
END LOOP;
END $$
I am trying to create a script to update passwords for a large number of users listed in a given table.
alter user FOO identified by FOOWORD;
I can call the usernames via the following statement:
select owner from usertable_verson where rownum = 1
Is there a way to combine these two statements, so that the alter user command works for each result of the select command?
The eventual goal is to create a loop for each username in the selected column, and apply the password change to each.
you can do this via dynamic SQL
smth like this:
begin
for rc in (select owner from usertable_verson) loop
execute immediate 'alter user '||rc.owner||' identified by FOOWORD';
end loop;
end;
I'm trying to pass a dynamic SQL statement to spool out to a text file using SQL*Plus, but I can't seem to execute the select statement I'm generating.
set linesize 10000 pagesize 0 embedded on
set heading off feedback off verify off trimspool on trimout on termout off
set underline off
COLUMN gen_sql NEW_VALUE gen_sql_
SELECT 'SELECT * FROM USER_TAB_COLS WHERE ROWNUM < 10' gen_sql_ FROM DUAL;
SPOOL 'myfilename.csv'
EXECUTE IMMEDIATE &gen_sql_
SPOOL OFF
/
I can't seem to use EXECUTE IMMEDIATE. Is there another way to execute the results of the select statement??
MORE DETAIL:
I have a set of views whose output I'd like to generate as formatted CSV files. I'm using dynamic SQL to create the formatting essentially. I generate something similar to:
SELECT TRIM(col1)||','||TRIM(col2)...FROM {myview}
I'm using the following to generate it this way:
COLUMN gen_sql NEW_VALUE gen_sql_
SELECT 'SELECT ' || LISTAGG ('TRIM('||COLUMN_NAME||')', '||'',''|| ')
WITHIN GROUP (ORDER BY COLUMN_ID) gen_sql FROM...
Anyway, I'm able generate this SQL statement and store into a SQL*PLUS variable, but I just need to execute it after the SPOOL statement so that it will print to the file. I'm not sure how to execute it. Normal statements work, such as:
SPOOL 'myfilename.csv'
SELECT 1 col1 FROM DUAL;
SPOOL OFF
/
So, it would seem reasonable that I could something similar but executing the contents of my variable like:
SPOOL 'myfilename.csv'
--- RUN MY DYNAMIC SQL ----
SPOOL OFF
/
I think this is what you're trying to achieve:
set linesize 10000 pagesize 0 embedded on
set heading off feedback off verify off trimspool on trimout on termout off
set underline off
SPOOL myfilename.sql
SELECT 'SELECT table_name||'',''||column_name FROM USER_TAB_COLS WHERE ROWNUM < 10;' gen_sql_ FROM DUAL;
SPOOL OFF
spool results.csv
#myfilename.sql
SPOOL OFF
I.e. first you spool the results of your query into a file, and then once the spool is complete, you call the script you just created, spooling the results of that into a separate file.
I believe you'll find EXECUTE IMMEDIATE is a PL/SQL command, so cannot be used directly in SQL or SQL*plus.
http://docs.oracle.com/cd/B12037_01/appdev.101/b10807/13_elems017.htm
Also, SPOOL is a SQL*Plus command, and cannot be used in PL/SQL ..
So you have a problem there ;)
Can you step back a bit and explain what it is you're trying to do ?
What is the requirements you have?
First you need to construct a sql dynamically using spool.
And then execute it.
set echo off
set verify off
set feedback off
set linesize 256
set pagesize 0
set term off
SPOOL 'myscript.sql'
SELECT * FROM USER_TAB_COLS WHERE ROWNUM < 10;
SPOOL OFF
set colsep ,
SPOOL myfile.csv
#myscript.sql
SPOOL OFF
I have a SQL script, which spools data to a file.
Sample Existing SQL script:
whenever sqlerror exit failure rollback
spool test.txt
set serveroutput on
select * from emp;
spool off
/
But, I would like to write a SQL query in this script before spooling data.
I don't want to hardcode the name of the spooling file, so how could I get the file name from a table or lookup?
I want the code to be something like
var filename varchar2(30);
select fname into :filename from table where script = 'abcscript';
spool :filename
set serveroutput on
select * from emp;
spool off
/
Thanks.
COLUMN spool_file_name NEW_VALUE.spool_file_name NOPRINT
select fname spool_file_name
from table where script = 'abcscript';
SPOOL &spool_file_name
SET ECHO ON
select * from emp ;
SPOOL OFF
COLUMN spool_file_name CLEAR
Working in Oracle 10g. Easy way to list all tables names (select table_name from dba_tables where owner = 'me')
But now that I have the table names, is there an easy way to loop through them and do a 'describe' on each one in sequence?
You could query against DBA_TAB_COLUMNS (or USER_TAB_COLUMNS).
Nicolas.
Not sure you can do a describe from within PL/SQL. I just tried using execute immediate 'describe some_table', that doesn't work either. Your next choice would be to query DBA_TAB_COLUMNS, or create a new file with all your describe statements (using dbms_output from pl/sql and spool to create the file) and then execute that file. Maybe like this:
spool temp_file.sql
BEGIN
/*or you could have a loop here with as many put_lines as you need, it will all end up in the new script file.*/
dbms_output.put_line('describe some_table');
END;
/
spool off
#temp_file.sql
/*I have not actually tried running this code, beware syntax errors!*/
You can do this in PL/SQL using DBMS_METADATA.GET_DDL, e.g. (example taken from docs):
SET LONG 2000000
SET PAGESIZE 0
SELECT DBMS_METADATA.GET_DDL('TABLE','EMP','SCOTT') FROM DUAL;
login with the user and then run the following commands, first file will contain the describe commands and the second file will be the desired file containing all the descriptions of all tables for logged in user
spool desctables.sql
select 'describe '||table_name||';' from user_tables;
spool off
spool alltables.txt
#desctables.sql
spool off
I'd recommend querying dba_tab_columns, as N. Gasparotto suggested, but if you really want describe output then create a file mulit-describe.sql with the following:
set pagesize 0
set termout off
set feedback off
set verify off
spool mdtmp.sql
select 'describe ' || owner || '.' || table_name
from dba_tables
where OWNER = upper('&1')
/
spool off
set termout on
#mdtmp.sql
Within SQL*PLUS run by:
#multi-describe ME