公众号推荐
微信公众号搜"智元新知" 关注 微信扫一扫可直接关注哦!
Postgresql 相关系统表查询
CREATE TABLE TEST(
TEST_NAME CHAR (30) NOT NULL ,
TEST_ID INTEGER DEFAULT '0' TEST_DATE TIMESTAMP NULL
);
ALTERTABLE TEST ADD CONSTRAINT PK_TEST PRIMARY KEY (TEST_ID);
--TABLETEST2withsomeCONSTRAINTsandanINDEX
TABLETEST2(
ID INTEGER FIELD1 INTEGER ,248); line-height:18px"> FIELD2 CHAR (15),248); line-height:18px"> FIELD3 VARCHAR (50),248); line-height:18px"> FIELD4 FIELD5 ID2 TABLE TEST2 CONSTRAINT PK_TEST2 KEY (ID2);
CONSTRAINTTEST2_FIELD1ID_IDX UNIQUE (ID,FIELD1);
CONSTRAINTTEST2_FIELD4_IDX UNIQUE (FIELD4);
INDEXTEST2_FIELD5_IDX ON TEST2(FIELD5);
--TABLENUMBERS
TABLENUMBERS(
NUMBER EN CHAR (100) FR --TABLENEWTABLE
TABLENEWTABLE(
INTDEFAULT 0 SOMENAME VARCHAR (12),248); line-height:18px"> SOMEDATE TABLE NEWTABLE CONSTRAINT PKINDEX_IDX KEY (ID);
SEQUENCENEWTABLE_SEQINCREMENT1START1;
--VIEWonTEST
VIEW"testview" (
TEST_NAME,248); line-height:18px"> TEST_ID,248); line-height:18px"> TEST_DATE
) AS
SELECT*
FROMTEST
WHERETEST_NAME LIKE 't%' ;
--VIEWonNUMBERS
VIEW"numbersview" (
NUMBER,248); line-height:18px"> TRANS_EN,248); line-height:18px"> TRANS_FR
FROMNUMBERS
WHERENUMBER>100;
--TRIGGERonNEWTABLE
FUNCTIONadd_stamp() RETURNS OPAQUE AS '
BEGIN
IF(NEW.so medate IS NULL OR NEW.so medate=0) THEN
NEW.so medate:= CURRENT_TIMESTAMP ;
RETURNNEW;
ENDIF;
END;
'LANGUAGE' plpgsql ';
TRIGGERADDCURRENTDATE
BEFORE INSERT OR UPDATE
ONnewtable FOR EACHROW
EXECUTEPROCEDURE add_stamp();
--TABLEsfortestingCONSTRAINTs
TABLEtestconstraints(
someid integer somename chara cter varying (10) CONSTRAINT testconstraints_id_pk KEY (someid)
TABLEtestconstraints2(
ext_id modified date ,248); line-height:18px"> uniquefield usraction CONSTRAINT testconstraints_id_fk FOREIGN KEY (ext_id)
REFERENCEStestconstraints(someid)MATCHSIMPLE
ONUPDATE CASCADE DELETE CASCADE ,153); background-color:inherit; font-weight:bold">CONSTRAINT unique_2_fields_idx UNIQUE (modified,usraction),153); background-color:inherit; font-weight:bold">CONSTRAINT uniquefld_idx UNIQUE (uniquefield)
);
--TABLETEST
CREATE TABLE TEST(
TEST_NAMECHAR (30) NOT NULL ,
TEST_IDINTEGER DEFAULT '0' TEST_DATETIMESTAMP NULL
);
ALTER TABLE TEST ADD CONSTRAINT PK_TEST PRIMARY KEY (TEST_ID);
--TABLETEST2withsomeCONSTRAINTsandanINDEX
TABLETEST2(
IDINTEGER FIELD1INTEGER ,108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px"> FIELD2CHAR (15),248); line-height:18px"> FIELD3VARCHAR (50),108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px"> FIELD4 FIELD5 ID2TABLE TEST2 CONSTRAINT PK_TEST2 KEY (ID2);
CONSTRAINTTEST2_FIELD1ID_IDX UNIQUE (ID,FIELD1);
CONSTRAINTTEST2_FIELD4_IDX UNIQUE (FIELD4);
INDEXTEST2_FIELD5_IDX ON TEST2(FIELD5);
--TABLENUMBERS
TABLENUMBERS(
NUMBER ENCHAR (100) FRNULL
);
--TABLENEWTABLE
TABLENEWTABLE(
INTDEFAULT 0 SOMENAMEVARCHAR (12),108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px"> SOMEDATETABLE NEWTABLE CONSTRAINT PKINDEX_IDX KEY (ID);
SEQUENCENEWTABLE_SEQINCREMENT1START1;
--VIEWonTEST
VIEW"testview" (
TEST_ID,248); line-height:18px"> TEST_DATE
)AS
SELECT*
FROMTEST
WHERETEST_NAME LIKE 't%' ;
--VIEWonNUMBERS
VIEW"numbersview" (
TRANS_EN,248); line-height:18px"> TRANS_FR
FROMNUMBERS
WHERENUMBER>100;
--TRIGGERonNEWTABLE
FUNCTIONadd_stamp() RETURNS OPAQUE AS '
BEGIN
IF(NEW.so medateIS NULL OR NEW.so medate=0) THEN
NEW.so medate:=CURRENT_TIMESTAMP ;
RETURNNEW;
ENDIF;
END;
'LANGUAGE' plpgsql ';
TRIGGERADDCURRENTDATE
BEFOREINSERT OR UPDATE
ONnewtable FOR EACHROW
EXECUTEPROCEDURE add_stamp();
--TABLEsfortestingCONSTRAINTs
TABLEtestconstraints(
someidinteger somenamechara cter varying (10) CONSTRAINT testconstraints_id_pk KEY (someid)
TABLEtestconstraints2(
ext_id modifieddate ,248); line-height:18px"> uniquefield usractionCONSTRAINT testconstraints_id_fk FOREIGN KEY (ext_id)
REFERENCEStestconstraints(someid)MATCHSIMPLE
ONUPDATE CASCADE DELETE CASCADE ,153); background-color:inherit; font-weight:bold">CONSTRAINT unique_2_fields_idx UNIQUE (modified,153); background-color:inherit; font-weight:bold">CONSTRAINT uniquefld_idx UNIQUE (uniquefield)
);
列出所有数据库 中的表名
SELECT relname
FROMpg_class
WHERErelname!~ '^(pg_|sql _)'
AND relkind= 'r' ;
<!
SELECTc.relname AS "Name"
FROMpg_classc,pg_useru
WHEREc.relowner=u.usesysid
ANDc.relkind= 'r'
ANDNOT EXISTS(
SELECT1
FROMpg_views
WHEREviewname=c.relname
)
ANDc.relname!~ '^(pg_|sql _)'
UNION
FROMpg_classc
WHEREc.relkind= 'r'
FROMpg_user
WHEREusesysid=c.relowner
ANDc.relname!~ '^pg_' ;
-->
--usinginformat ION_SCHEMA:
SELECTtable_name
FROMinformat ion_schema.tables
WHEREtable_type= 'BASETABLE'
ANDtable_schema IN
( 'pg_catalog' , 'informat ion_schema' );
SELECTrelname
FROMpg_class
WHERErelname!~ '^(pg_|sql _)'
AND relkind= 'r' ;
<!
SELECTc.relname AS "Name"
FROMpg_classc,pg_useru
WHEREc.relowner=u.usesysid
AND c.relkind= 'r'
ANDNOT EXISTS(
SELECT1
FROMpg_views
WHEREviewname=c.relname
)
ANDc.relname!~ '^(pg_|sql _)'
UNION
AS"Name"
FROMpg_classc
WHEREc.relkind= 'r'
NOTEXISTS(
SELECT1
FROMpg_user
WHEREusesysid=c.relowner
)
ANDc.relname!~ '^pg_' ;
-->
--usinginformat ION_SCHEMA:
SELECTtable_name
FROMinformat ion_schema.tables
WHEREtable_type= 'BASETABLE'
ANDtable_schema IN
('pg_catalog' , 'informat ion_schema' );
列出所有视图
sql 代码
SELECTviewname
WHEREviewname!~ '^pg_' ;
--withpostgresql 7.4andlater:
WHEREschemaname 'informat ion_schema' )
ANDviewname!~ '^pg_' ;
WHEREtable_type= 'VIEW'
ANDtable_name!~ '^pg_' ;
--or
FROMinformat ion_schema.views
WHEREtable_schema IN ( 'pg_catalog' ,248); line-height:18px"> #show only theVIEWsreferencingagiven table
NATURAL JOIN pg_tables
WHEREtablename= 'test' ;
-->
--withpostgresql 7.2:
SELECTviewname
WHEREviewname!~ '^pg_' ;
--withpostgresql 7.4andlater:
WHEREschemaname 'informat ion_schema' )
ANDviewname!~ '^pg_' ;
--usinginformat ION_SCHEMA:
SELECTtable_name
FROMinformat ion_schema.tables
WHEREtable_type= 'VIEW'
IN
('pg_catalog' , 'informat ion_schema' )
ANDtable_name!~ '^pg_' ;
--or
FROMinformat ion_schema.views
WHEREtable_schema IN ( 'pg_catalog' ,128); background-color:inherit">AND table_name!~ '^pg_' ;
<!
#showonly theVIEWsreferencingagiven table
NATURALJOIN pg_tables
WHEREtablename= 'test' ;
-->
列出所有用户
SELECTusename
FROMpg_user;
SELECTusename
FROMpg_user;
列出某表中得所有字段
SELECTa.attname
sql" style="margin:0px 0px 1px 45px!important; padding:0px; border:none; list-style-position:initial; background-color:rgb(255,pg_attributea,pg_typet
WHEREc.relname= 'test2'
ANDa.attnum>0
ANDa.attrelid=c.oid
ANDa.atttypid=t.oid
--withinformat ION_SCHEMA:
SELECTcolumn_name
FROMinformat ion_schema.columns
WHEREtable_name= 'test2' ;
SELECTa.attname
WHEREc.relname= 'test2'
ANDa.attnum>0
ANDa.attrelid=c.oid
ANDa.atttypid=t.oid
--withinformat ION_SCHEMA:
SELECTcolumn_name
FROMinformat ion_schema.columns
WHEREtable_name= 'test2' ;
列出某表字段的信息
SELECTa.attnum
AS ordinal_position,
a.attname AS column_name,248); line-height:18px"> t.typname AS data_type,248); line-height:18px"> a.attlen AS chara cter_maximum_length,248); line-height:18px"> a.atttypmod AS modifier,248); line-height:18px"> a.attnotnull AS notnull,248); line-height:18px"> a.atthasdef AS hasdefault
pg_attributea,248); line-height:18px"> pg_typet
ORDER BY a.attnum;
SELECT ordinal_position,248); line-height:18px"> column_name,248); line-height:18px"> data_type,248); line-height:18px"> column_default,248); line-height:18px"> is_nullable,248); line-height:18px"> chara cter_maximum_length,248); line-height:18px"> numeric_precision
WHERE table_name= 'test2'
BY ordinal_position;
SELECTa.attnum AS ordinal_position,248); line-height:18px"> a.attnameAS column_name,108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px"> t.typnameAS data_type,248); line-height:18px"> a.attlenAS chara cter_maximum_length,108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px"> a.atttypmodAS modifier,248); line-height:18px"> a.attnotnullAS notnull,108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px"> a.atthasdefAS hasdefault
pg_attributea,248); line-height:18px"> pg_typet
ORDER BY a.attnum;
--withinformat ION_SCHEMA:
SELECT ordinal_position,108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px"> data_type,108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px"> is_nullable,108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px"> numeric_precision
FROM informat ion_schema.columns
WHERE table_name= 'test2'
BY ordinal_position;
List INDICES
Here's the query that will return the names of the INDICES defined in the TEST2 table. Unfortunately I have no idea how to extract them from the informat ION_SCHEMA. If you do,please let me kNow .
NB: the CONSTRAINTs are not listed
WHEREoid IN (
SELECTindexrelid
FROMpg_index,pg_class
WHEREpg_class.relname= 'test2'
ANDpg_class.oid=pg_index.indrelid
ANDindis unique!= 't'
ANDindis primary!= 't'
cop y
WHEREoid IN (
SELECTindexrelid
FROMpg_index,pg_class
WHEREpg_class.relname= 'test2'
ANDpg_class.oid=pg_index.indrelid
ANDindis unique!= 't'
ANDindis primary!= 't'
);
列出表 的索引信息
SELECTrelname,indkey
FROMpg_class,pg_index
WHEREpg_class.oid=pg_index.indexrelid
ANDpg_class.oid
SELECTt.relname,a.attname,a.attnum
FROMpg_indexc
LEFT JOIN pg_classt
ONc.indrelid=t.oid
JOINpg_attributea
ONa.attrelid=t.oid
ANDa.attnum= ANY (indkey)
WHEREt.relname= 'test2'
ANDa.attnum=6;
SELECTrelname,indkey
FROMpg_class,pg_index
WHEREpg_class.oid=pg_index.indexrelid
ANDpg_class.oid IN (
SELECTindexrelid
WHEREpg_class.relname= 'test2'
ANDpg_class.oid=pg_index.indrelid
ANDindis unique!= 't'
ANDindis primary!= 't'
SELECTt.relname,a.attnum
FROMpg_indexc
LEFT JOIN pg_classt
ONc.indrelid=t.oid
JOINpg_attributea
ONa.attrelid=t.oid
ANDa.attnum= ANY (indkey)
WHEREt.relname= 'test2'
ANDa.attnum=6;
列出表 的约束
SELECTc.conname
AS constraint_name,147); background-color:inherit">CASEc.contype
WHEN'c' THEN 'CHECK'
WHEN'f' THEN 'FOREIGNKEY'
WHEN'p' THEN 'PRIMARYKEY'
WHEN'u' THEN 'UNIQUE'
ENDAS "constraint_type" ,147); background-color:inherit">CASE WHEN c.condeferrable= 'f' THEN 0 ELSE 1 AS is_deferrable,153); background-color:inherit; font-weight:bold">WHEN c.condeferred= 'f' AS is_deferred,248); line-height:18px"> t.relname AS table_name,248); line-height:18px"> array_to_string(c.conkey, '' ) AS constraint_key,147); background-color:inherit">CASE confupdtype
WHEN'a' THEN 'NOACTION'
WHEN'r' THEN 'RESTRICT'
THEN'CASCADE'
WHEN'n' THEN 'SETNULL'
WHEN'd' THEN 'SETDEFAULT'
ASon_update,147); background-color:inherit">CASE confd eltype
ASon_delete,147); background-color:inherit">CASE confmatchtype
THEN'UNSPECIFIED'
THEN'FULL'
THEN'PARTIAL'
ASmatch_type,248); line-height:18px"> t2.relname AS references_table,248); line-height:18px"> array_to_string(c.confkey,153); background-color:inherit; font-weight:bold">AS fk_constraint_key
FROMpg_constraintc
JOINpg_classt ON c.conrelid=t.oid
JOINpg_classt 2 ON c.confrelid=t2.oid
WHEREt.relname= 'testconstraints2'
ANDc.conname= 'testconstraints_id_fk' ;
SELECTtc.constraint_name,248); line-height:18px"> tc.constraint_type,248); line-height:18px"> tc.table_name,248); line-height:18px"> kcu.column_name,248); line-height:18px"> tc.is_deferrable,248); line-height:18px"> tc.initially_deferred,248); line-height:18px"> rc.match_option rc.update_rule rc.delete_rule ccu.table_name ccu.column_name AS references_field
FROMinformat ion_schema.table_constraintstc
JOINinformat ion_schema.key_column_usagekcu
ONtc.constraint_catalog=kcu.constraint_catalog
ANDtc.constraint_schema=kcu.constraint_schema
ANDtc.constraint_name=kcu.constraint_name
JOINinformat ion_schema.referential _constraintsrc
ONtc.constraint_catalog=rc.constraint_catalog
ANDtc.constraint_schema=rc.constraint_schema
ANDtc.constraint_name=rc.constraint_name
JOINinformat ion_schema.constraint_column_usageccu
ONrc.unique_constraint_catalog=ccu.constraint_catalog
ANDrc.unique_constraint_schema=ccu.constraint_schema
ANDrc.unique_constraint_name=ccu.constraint_name
WHEREtc.table_name= 'testconstraints2'
ANDtc.constraint_name= 'testconstraints_id_fk' ;
SELECTc.conname AS constraint_name,248); line-height:18px"> CASE c.contype
WHEN 'c' THEN 'CHECK'
WHEN'f' THEN 'FOREIGNKEY'
WHEN'p' THEN 'PRIMARYKEY'
WHEN'u' THEN 'UNIQUE'
ENDAS "constraint_type" ,147); background-color:inherit">CASE WHEN c.condeferrable= 'f' THEN 0 ELSE 1 AS is_deferrable,153); background-color:inherit; font-weight:bold">WHEN c.condeferred= 'f' AS is_deferred,248); line-height:18px"> t.relnameAS table_name,108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px"> array_to_string(c.conkey,'' ) AS constraint_key,147); background-color:inherit">CASE confupdtype
WHEN'a' THEN 'NOACTION'
WHEN'r' THEN 'RESTRICT'
THEN'CASCADE'
WHEN'n' THEN 'SETNULL'
WHEN'd' THEN 'SETDEFAULT'
ASon_update,147); background-color:inherit">CASE confd eltype
THEN'NOACTION'
THEN'RESTRICT'
THEN'CASCADE'
THEN'SETNULL'
THEN'SETDEFAULT'
ASon_delete,147); background-color:inherit">CASE confmatchtype
THEN'UNSPECIFIED'
THEN'FULL'
THEN'PARTIAL'
ASmatch_type,108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px"> t2.relnameAS references_table,153); background-color:inherit; font-weight:bold">AS fk_constraint_key
FROMpg_constraintc
JOINpg_classt ON c.conrelid=t.oid
JOINpg_classt 2 ON c.confrelid=t2.oid
WHEREt.relname= 'testconstraints2'
ANDc.conname= 'testconstraints_id_fk' ;
SELECTtc.constraint_name,108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px"> tc.table_name,108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px"> tc.is_deferrable,108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px"> rc.match_option rc.update_rule rc.delete_rule ccu.table_name ccu.column_nameAS references_field
FROMinformat ion_schema.table_constraintstc
JOINinformat ion_schema.key_column_usagekcu
ONtc.constraint_catalog=kcu.constraint_catalog
ANDtc.constraint_schema=kcu.constraint_schema
ANDtc.constraint_name=kcu.constraint_name
JOINinformat ion_schema.referential _constraintsrc
ONtc.constraint_catalog=rc.constraint_catalog
ANDtc.constraint_schema=rc.constraint_schema
ANDtc.constraint_name=rc.constraint_name
JOINinformat ion_schema.constraint_column_usageccu
ONrc.unique_constraint_catalog=ccu.constraint_catalog
ANDrc.unique_constraint_schema=ccu.constraint_schema
ANDrc.unique_constraint_name=ccu.constraint_name
WHEREtc.table_name= 'testconstraints2'
ANDtc.constraint_name= 'testconstraints_id_fk' ;
列出所有序列
WHERErelkind= 'S'
ANDrelnamespace SELECT oid
FROMpg_namespace
WHEREnspname LIKE 'pg_%'
ANDnspname!= 'informat ion_schema'
cop y
WHERErelkind= 'S'
ANDrelnamespace SELECT oid
FROMpg_namespace
WHEREnspname LIKE 'pg_%'
ANDnspname!= 'informat ion_schema'
);
列出所有触发器
SELECT trg.tgnameAS trigger_name
FROM
pg_triggertrg,pg_classt bl
WHEREtrg.tgrel id=tbl.oid
ANDtbl.relname!~ '^pg_' ;
SELECTtgname AS trigger_name
FROMpg_trigger
WHEREtgname!~ '^pg_' ;
SELECTdis TINCTtrigger_name
FROMinformat ion_schema.triggers
WHEREtrigger_schema 'informat ion_schema' );
SELECTtrg.tgname AND tbl.relname= 'newtable' ;
WHEREevent_object_table= 'newtable'
ANDtrigger_schema cop y
SELECTtrg.tgname AS trigger_name
FROMpg_triggertrg,pg_classt bl
WHEREtrg.tgrel id=tbl.oid
ANDtbl.relname!~ '^pg_' ;
--or
SELECTtgname AS trigger_name
FROMpg_trigger
WHEREtgname!~ '^pg_' ;
SELECTdis TINCTtrigger_name
FROMinformat ion_schema.triggers
WHEREtrigger_schema 'informat ion_schema' );
ANDtbl.relname= 'newtable' ;
WHEREevent_object_table= 'newtable'
ANDtrigger_schema 列出所有触发器的信息
SELECTtrg.tgname
AS trigger_name,248); line-height:18px"> tbl.relname p.proname AS function_name,147); background-color:inherit">CASE trg.tgtype& cast (2 as int2)
WHEN0 THEN 'AFTER'
ELSE'BEFORE'
AStrigger_type,147); background-color:inherit">cast (28 WHEN 16 THEN 'UPDATE'
WHEN8 THEN 'DELETE'
WHEN4 THEN 'INSERT'
WHEN20 THEN 'INSERT,UPDATE'
WHEN28
WHEN24 THEN 'UPDATE,153); background-color:inherit; font-weight:bold">WHEN 12 AS trigger_event,147); background-color:inherit">cast (1 THEN 'STATEMENT'
ELSE'ROW'
ASaction_orientation
pg_classt bl,248); line-height:18px"> pg_procp
ANDtrg.tgfoid=p.oid
cop y
AStrigger_name,248); line-height:18px"> tbl.relname p.pronameAS function_name,147); background-color:inherit">CASE trg.tgtype& cast (2 as int2)
WHEN0 THEN 'AFTER'
ELSE'BEFORE'
AStrigger_type,147); background-color:inherit">cast (28 WHEN 16 THEN 'UPDATE'
WHEN8 THEN 'DELETE'
WHEN4 THEN 'INSERT'
WHEN20 THEN 'INSERT,UPDATE'
WHEN28
WHEN24 THEN 'UPDATE,DELETE'
WHEN12 AS trigger_event,147); background-color:inherit">cast (1 as int2)
THEN'STATEMENT'
ELSE'ROW'
ASaction_orientation
pg_procp
WHEREtrg.tgrel id=tbl.oid
ANDtrg.tgfoid=p.oid
列出所有函数
SELECTproname
FROMpg_procpr,248); line-height:18px"> pg_typetp
WHEREtp.oid=pr.prorettype
ANDpr.proisagg= FALSE
ANDtp.typname<> 'trigger'
ANDpr.pronamespace SELECT routine_name
FROMinformat ion_schema.routines
WHEREspecific_schema AND type_udt_name!= 'trigger' ;
SELECTproname
FROMpg_procpr,108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px"> pg_typetp
WHEREtp.oid=pr.prorettype
ANDpr.proisagg= FALSE
ANDtp.typname<> 'trigger'
ANDpr.pronamespace SELECT oid
FROMpg_namespace
LIKE'pg_%'
ANDnspname!= 'informat ion_schema'
SELECTroutine_name
FROMinformat ion_schema.routines
WHEREspecific_schema AND type_udt_name!= 'trigger' ;
Albe Laurenz sent me the following function that is even more informat ive: for a function name and schema,it selects the position in the argument list,the direction,the name and the data-type of each argument. This procedure requires Postgresql 8.1 or later.
CREATE
OR
REPLACE
FUNCTION
public .function_args(
INfuncname varying ,128); background-color:inherit">IN schema OUT pos integer ,153); background-color:inherit; font-weight:bold">OUT direction chara cter ,153); background-color:inherit; font-weight:bold">OUT argname OUT datatype varying )
RETURNSSeto FRECORD AS $$ DECLARE
rettype varying ;
argtypesoidvector;
allargtypesoid[];
argmodes "char" [];
argnamestext[];
mini integer ;
maxi /*geto bjectID of function */
INTOrettype,argtypes,allargtypes,argmodes,argnames
CASE
WHENpg_proc.proretset
THEN'seto f' ||pg_catalog.format_type(pg_proc.prorettype, NULL )
ELSEpg_catalog.format_type(pg_proc.prorettype,128); background-color:inherit">NULL ) END ,248); line-height:18px"> pg_proc.proargtypes,248); line-height:18px"> pg_proc.proallargtypes,248); line-height:18px"> pg_proc.proargmodes,248); line-height:18px"> pg_proc.proargnames
FROMpg_catalog.pg_proc
JOINpg_catalog.pg_namespace
ON(pg_proc.pronamespace=pg_namespace.oid)
WHEREpg_proc.prorettype<> 'pg_catalog.cstring' ::pg_catalog.regtype
AND(pg_proc.proargtypes[0] OR pg_proc.proargtypes[0]<> 'pg_catalog.cstring' ::pg_catalog.regtype)
NOTpg_proc.proisagg
ANDpg_proc.proname=funcname
ANDpg_namespace.nspname= schema
ANDpg_catalog.pg_function_is_visible(pg_proc.oid);
/*bail out if not found*/
IF NOT FOUND RETURN ;
/* return arow for the return value*/
pos=0;
direction= 'o' :: char ;
argname= 'RETURNVALUE' ;
datatype=rettype;
RETURNNEXT ;
/*unfortunatelyallargtypes is NULL ifthereare no OUT para meters*/
IFallargtypes NULL mini=array_lower(argtypes,1);maxi=array_upper(argtypes,1);
ELSE
mini=array_lower(allargtypes,1);maxi=array_upper(allargtypes,248); line-height:18px"> IFmaxi<mini THEN RETURN ; /*loop all thearguments*/
FORi IN mini..maxiLOOP
pos=i-mini+1;
IFargnames argname= NULL ;
argname=argnames[pos];
direction= 'i' :: datatype=pg_catalog.format_type(argtypes[i],128); background-color:inherit">NULL );
direction=argmodes[i];
datatype=pg_catalog.format_type(allargtypes[i],153); background-color:inherit; font-weight:bold">END LOOP;
END;$$LANGUAGEplpgsql STABLESTRICTSecurity INVOKER;
COMMENT FUNCTION public .function_args( chara cter
IS$$ For a function name and schema ,this procedure selects for each
argumentthefollowingdata:
-position in theargumentlist(0 return value)
-direction 'i' , 'o' ,128); background-color:inherit">or 'b'
- name ( NULL if not defined)
-datatype$$;
CREATEOR REPLACE FUNCTION public .function_args(
INfuncname varying ,128); background-color:inherit">IN schema OUT pos integer ,153); background-color:inherit; font-weight:bold">OUT direction chara cter ,153); background-color:inherit; font-weight:bold">OUT argname OUT datatype varying )
RETURNSSeto FRECORD AS $$ DECLARE
rettypevarying ;
argtypesoidvector;
allargtypesoid[];
argmodes"char" [];
argnamestext[];
miniinteger ;
maxiinteger ;
/*geto bjectIDof function */
INTOrettype,argnames
CASE
WHENpg_proc.proretset
THEN'seto f' ||pg_catalog.format_type(pg_proc.prorettype,128); background-color:inherit">NULL )
ELSEpg_catalog.format_type(pg_proc.prorettype,128); background-color:inherit">NULL ) END ,108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px"> pg_proc.proargtypes,108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px"> pg_proc.proargmodes,248); line-height:18px"> pg_proc.proargnames
FROMpg_catalog.pg_proc
JOINpg_catalog.pg_namespace
ON(pg_proc.pronamespace=pg_namespace.oid)
WHEREpg_proc.prorettype<> 'pg_catalog.cstring' ::pg_catalog.regtype
AND(pg_proc.proargtypes[0] OR pg_proc.proargtypes[0]<> 'pg_catalog.cstring' ::pg_catalog.regtype)
NOTpg_proc.proisagg
ANDpg_proc.proname=funcname
ANDpg_namespace.nspname= schema
ANDpg_catalog.pg_function_is_visible(pg_proc.oid);
/*bailout if not found*/
IFNOT FOUND RETURN ;
ENDIF;
/*return arow for the return value*/
pos=0;
direction='o' :: char ;
argname='RETURNVALUE' ;
datatype=rettype;
RETURNNEXT ;
/*unfortunatelyallargtypesis NULL ifthereare no OUT para meters*/
IFallargtypesNULL ELSE
IFmaxi<miniTHEN RETURN ; /*loopall thearguments*/
FORi IN mini..maxiLOOP
pos=i-mini+1;
IFargnames argname=NULL ;
argname=argnames[pos];
IFallargtypesTHEN
direction='i' :: NULL );
direction=argmodes[i];
datatype=pg_catalog.format_type(allargtypes[i],128); background-color:inherit">NULL );
NEXT;
ENDLOOP;
END;$$LANGUAGEplpgsql STABLESTRICTSecurity INVOKER;
COMMENTpublic .function_args( chara cter
IS$$ For a function name and schema ,153); background-color:inherit; font-weight:bold">procedure selects for each
argumentthefollowingdata:
-positionin theargumentlist(0 return value)
-direction'i' , 'o' ,128); background-color:inherit">or 'b'
-name ( NULL if not defined)
-datatype$$;
SELECTp.proname AS procedure_name,248); line-height:18px"> p.pronargs AS num_args,248); line-height:18px"> t1.typname AS return_type,248); line-height:18px"> a.rolname AS procedure_owner,248); line-height:18px"> l.lanname AS language_type,248); line-height:18px"> p.proargtypes AS argument_types_oids,248); line-height:18px"> prosrc AS body
FROM pg_procp
JOIN pg_typet1 ON p.prorettype=t1.oid
JOIN pg_authida ON p.proowner=a.oid
JOIN pg_languagel ON p.prolang=l.oid
WHERE proname=:PROCEDURE_NAME;
原文地址:https://www.jb51.cc/postgresql/196197.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。