How to use the system catalogue view - sql

I have been tasked to find the names of relational tables together with the names of its attributes, data types of attributes, NULL/NOT NULL constraints, and column ids of all tables owned by my account. How do i go about doing that?
I have tried,
SELECT * FROM information_schema.SCHEMATA S;
but got
ERROR at line 1:
ORA-00942: table or view does not exist
Also tried
SELECT table_name,
column_name,
data_type,
data_length "LENGTH",
data_precision "PRECISION",
FROM user_tab_columns WHERE table_name = 'PART'
ORDER BY user_tab_columns.table_name, column_name;
FROM user_tab_columns WHERE table_name = 'PART'
*
ERROR at line 6:
ORA-00936: missing expression
Can anyone give me an idea what should i do?

Please try
SELECT *
FROM information_schema.columns

Your second formulation is basically correct. Your error is because of a comma before the FROM:
SELECT table_name, column_name, data_type, data_length as "LENGTH",
data_precision as "PRECISION"
------------------------------------^
FROM user_tab_columns
WHERE table_name = 'PART'
ORDER BY table_name, column_name;
The INFORMATION_SCHEMA views are ANSI standard views for metadata available in many databases. However, Oracle does not (yet?) support them. So you need to use Oracle's metadata views and tables for this purpose.

Related

An equivalence of ".schema sqlite_master" in Oracle

I'm trying to do the same exercise for both SQLite and Oracle. In SQLite, there is a table sqlite_master containing a description of all of the other tables, indexes, triggers, and views that are contained within the database. I can see the query to generate sqlite_master with .schema sqlite_master.
In Oracle, the data dictionary is presented to us in the form of a number of views (DBA, ALL or USER). Let's take the table USER_TABLES as an example. We can do query on USER_TABLES, for example
SELECT table_name
FROM USER_TABLES;
Is there anyway to get the query used to create the table USER_TABLES in Oracle? I tried
SELECT dbms_metadata.get_ddl('TABLE', 'USER_TABLES')
FROM dual;
but it does not work.
I am not sure what are you looking for but if you want the definition of any table in oracle you can use :
Describe TableName
Or if you want to have list of tables, views or columns you can use below queries:
For Tables :
select * from select * from all_tables
For Columns :
select * from all_tab_columns
For Views :
select * from select * from all_views
To get all the column information of a table:
select *
from all_tab_columns
where upper(table_name) = upper('Test')
order by column_id
Typically oracle stores table_name in uppercase so I used upper() or you can just type 'TEST'
You could use this one:
DECLARE
DDL CLOB;
BEGIN
FOR aTab IN (SELECT TABLE_NAME FROM USER_TABLES) LOOP
DDL := DBMS_METADATA.GET_DDL('TABLE', aTab.TABLE_NAME);
DBMS_OUTPUT.PUT_LINE(DDL);
END LOOP;
END;
You may customize the output with DBMS_METADATA.SET_TRANSFORM_PARAM() before you run the query.

Need to add to srting in postgresql select query result

i have a bundle of tables in my database. I need to truncate all the tables but not some.
so by using table_schema i can get list of table names!
select ''as "truncate", table_name
from information_schema.tables
where table_schema = 'public'
Expected output.
truncate table table_name restart identity.
some one tell me is there any better way to do that.
Use format() with placeholders for the schema and table name to make sure the names are quoted properly:
To properly deal with the foreign keys used by the tables, it would also be better to add the cascade option to the truncate command:
select format('truncate table %I.%I restart identity cascade;', table_schema, table_name) as stmt
from information_schema.tables
where table_schema = 'public';
Another option would be to truncate all tables in a single statement:
select concat('truncate table ', string_agg(format('%I.%I', table_schema, table_name), ', '), ' restart identity;') as stmt
from information_schema.tables
where table_schema = 'public'
You can concat strings in Postgres using ||
select 'truncate table' || table_name::text || ' restart identity'
from information_schema.tables
where table_schema = 'public
Take a look at 9.4. String Functions and Operators

View/edit table structure with SQL in Base

I'm JPablos and I trying to view the structure of "orders" table.
I'm using Base
LibreOffice Versión: 5.2.0.4 Id. de compilación: 1:5.2.0~rc4-0ubuntu1~xenial2 Subprocesos de CPU: 1; Versión de SO: Linux 4.4
SQL statement
select listagg(column_name ||','|| data_type ||','|| case
when data_type in ('VARCHAR2', 'NVARCHAR2', 'CHAR', 'RAW')
then to_char(data_length)
when data_type = 'NUMBER' and (data_precision is not null or data_scale is not null)
then data_precision || case
when data_scale > 0 then '.' || data_scale
end
end, ',') within group (order by column_id)
from all_tab_columns where table_name = 'orders';
Then SQL informs me
1: Access is denied: LISTAGG in statement [select listagg(]
Note: obviously... the easy way in Base UI: select "orders" / right click / Edit, and yes it opens the structure of table "orders". But, I want to use SQL to do it.
Thanks in advance
JPablos
The SQL statement is written for the Oracle database. The LISTAGG function is not supported by HSQLDB.
If you use LibreOffice base together with the latest HSQLDB 2.3.4 (instead of the bundled version 1.8.0) then you can use the HSQLDB function GROUP_CONCAT.
after all it is a SQL statement to do the query object of my question above, and is:
SELECT * FROM "INFORMATION_SCHEMA"."SYSTEM_COLUMNS" WHERE "TABLE_NAME" = 'Students'
Where "Students" is the name of a table used for this answer.
The SQL statement reports:
Result of the query
Best regards
JPablos

Get Columns Names of Table

How I can Get for a specific Table its columns Names ?
I tried this :
SELECT column_name
FROM USER_TAB_COLUMNS
WHERE table_name = 'x' ;
But it doesn't work.
Try this :
SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'TABLENAME'
Hope this helps.
EDIT :
The Oracle equivalent for information_schema.COLUMNS is USER_TAB_COLS for tables owned by the current user, ALL_TAB_COLS or DBA_TAB_COLS for tables owned by all users.
Tablespace is not equivalent to a schema, neither do you have to provide the tablespace name.
Providing the schema/username would be of use if you want to query ALL_TAB_COLS or DBA_TAB_COLS for columns OF tables owned by a specific user. in your case, I'd imagine the query would look something like:
String sqlStr= "
SELECT column_name
FROM all_tab_cols
WHERE table_name = 'users'
AND owner = ' || +_db+ || '
AND column_name NOT IN ( 'password', 'version', 'id' )
"
Note that with this approach, you risk SQL injection.
Source : Oracle query to fetch column names
String comparisons in Oracle are case sensitive by default, and table and column names are upper case by default, so you need to make sure that the capitalization of the table name you are searching for matches the the way it's stored in the database, so unless your table was named with mixed case or all lower case try making sure your string is all upper case.
SELECT column_name from USER_TAB_COLUMNS
WHERE table_name = 'X'; -- not 'x'
Additionally, if you don't own the table, then you need to use either ALL_TAB_COLUMNS or DBA_TAB_COLUMNS instead of USER_TAB_COLUMNS since USER_TAB_COLUMNS only lists details for tables owned by your current schema.
You can just describe the table:
desc x;
Try to queryUSER_TAB_COLUMNS view
SELECT column_name
FROM USER_TAB_COLUMNS
WHERE table_name = 'TABLE_NAME'

How to extract table definitions using SQL or Toad

Can somebody tell me how to extract my table definitions using SQL? I want to extract the datatypes of all my tables and other information from my Oracle schema. I have about 100 tables.
I need the complete documentation of my Oracle Schema. My schema name IS "cco".
Can I do this by SQL?
I am using Toad for Data analyst 3.3. Please let me know if this tool helps.
You can try this -
select * from all_tab_cols
where owner = 'CCO';
To get the DDL for all tables of the current user, you can use this:
select dbms_metadata.get_ddl('TABLE', table_name)
from user_tables;
You will need to adjust your SQL client to be able to properly display the content of a CLOB column.
More details (e.g. about how to get the DDL for other objects) can be found in the manual: http://docs.oracle.com/cd/B28359_01/appdev.111/b28419/d_metada.htm
you can use the table:USER_TAB_COLUMNS
Find below query example
select
table_name,
column_name,
data_type,
data_length,
data_precision,
nullable
from USER_TAB_COLUMNS
where table_name = '<table_name>';
This is only an example you can also do a select * to get more information.
you can also use the table: all_tab_columns
For a better display you can use:
select table_name,column_name, data_type||
case
when data_precision is not null and nvl(data_scale,0)>0 then '('||data_precision||','||data_scale||')'
when data_precision is not null and nvl(data_scale,0)=0 then '('||data_precision||')'
when data_precision is null and data_scale is not null then '(*,'||data_scale||')'
when char_length>0 then '('||char_length|| case char_used
when 'B' then ' Byte'
when 'C' then ' Char'
else null
end||')'
end||decode(nullable, 'N', ' NOT NULL') as data_type
from user_tab_columns
where table_name = '<TABLE_NAME>';