Esta es la tercera parte del artículo que describe funciones definidas por el usuario para trabajar con directorios del sistema: pg_class, pg_attribute, pg_constraints, etc.
Esta sección del artículo analiza las funciones que devuelven las
características de las secuencias, las tablas heredadas y las
características especiales de los atributos de la tabla .
Ver también
Funciones para documentar bases de datos PostgreSQL. Primera parte ;
Funciones para documentar bases de datos PostgreSQL. Parte dos ;
Funciones para documentar bases de datos PostgreSQL. El final (parte cuatro) .
La primera mitad del artículo proporciona comentarios sobre la implementación de funciones. El segundo es el código fuente de las funciones. Para aquellos lectores que solo están interesados en los textos de origen, sugerimos proceder inmediatamente al Apéndice .
Estructura de una función que devuelve una lista de características de secuencias de tablas.
Fig. 2. Funciones de las que dependen las funciones admtf_Table_SequencesTabla 11. Propósito de las funciones.No | Titulo | Cita |
---|
1 | admtf_Sequence_Features | La función devuelve una lista de características de secuencia de tabla. |
2 | admtf_Table_Sequences | La función devuelve una lista de secuencias de tablas de base de datos y sus características. |
Función Admtf_Sequence_Features : lista de características de secuencia de base de datos
La función admtf_Sequence_Features devuelve una lista de características de SECUENCIA de la base de datos. El código fuente se puede ver y descargar aquí .
La función admtf_Sequence_Features devuelve una lista de características de secuencia de base de datos ( SECUENCIA )
.
Como parámetros, la función toma el nombre de la secuencia ( a_SequenceName ) y el nombre del esquema dentro del cual se crea la secuencia ( a_SchemaName ).
La necesidad de la función admtf_Sequence_Features surgió porque las características principales de la secuencia se almacenan realmente en una tabla cuyo nombre coincide con el nombre de la secuencia, y los datos se extraen de ella utilizando la instrucción SELECT . En este caso, el nombre de la secuencia, el nombre del esquema y el comentario a la secuencia se almacenan en los directorios pg_class , pg_namespace y pg_description .
SELECT * FROM kr_road_network_vertices_pgr_id_seq;
Observación 6
PostgreSQL 10 separó las características de la secuencia y las características de sus estados. Para esto, se introdujo el directorio pg_sequence con características de secuencia, que contiene el valor inicial ( start_value ), increment ( increment_by ) y el valor máximo ( max_value ) de la secuencia. El último valor devuelto por la secuencia ( last_value ) se dejó en la "tabla" con el nombre de la secuencia.
El final del comentario.
La presentación de cada secuencia como un análogo de la tabla, creo, está dictada por la necesidad de almacenar el último valor utilizado de la secuencia ( last_value ), que es una característica del estado de la secuencia, pero no de la secuencia misma.
La entrada de secuencia en el directorio pg_class difiere de la entrada de la tabla por el valor del tipo de relación (relkind = 'S' ).
Para extraer las características de una secuencia arbitraria, debe usar SQL dinámico.
EXECUTE 'SELECT last_value,start_value,increment_by,max_value FROM '|| LOWER(a_SchemaName)||'.'||LOWER(a_SequenceName) INTO v_SequenceLastValue,v_SequenceStartValue, v_SequenceIncrementBy,v_SequenceMaxValue ;
Tabla 12. El resultado de ejecutar la función admtf_Sequence_Features ('public', 'kr_road_network_vertices_pgr_id_seq').Titulo | Comentario | Actual | Inicio | Incremento | El final |
---|
kr_road_network _vertices_pgr_id _seq | Secuencia | 138023 | 1 | 1 | 9223372036854775807 |
Función admtf_Table_Sequences lista de secuencias de tablas de base de datos y sus características
La función admtf_Table_Sequences devuelve una lista de secuencias ( SECUENCIA ) de la tabla de la base de datos que genera los valores de sus campos y las características de estas secuencias. El código fuente se puede ver y descargar aquí , y aquí hay una versión de una función que no utiliza un cursor .
Como parámetros, la función toma el nombre de la tabla fuente ( a_TableName ) y el nombre del esquema dentro del cual se crea la tabla (
a_SchemaName
)

El código fuente del operador en la figura SELECT pseq.relname AS SequenceName,snsp.nspname AS SequenceSchemaName, COALESCE(dsc.description,', ' ||da.attname) AS SequenceDescription, d.depType AS DependcyType,da.attname AS AttributeName FROM pg_depend d INNER JOIN pg_class pseq ON d.objid = pseq.oid INNER JOIN pg_namespace snsp ON pseq.relnamespace=snsp.oid LEFT OUTER JOIN pg_Description dsc ON pseq.oid=dsc.objoid AND dsc.objsubid=0 INNER JOIN pg_class tbl ON d.refobjid = tbl.oid INNER JOIN pg_namespace nsp ON tbl.relnamespace=nsp.oid INNER JOIN pg_attribute da ON da.attrelid= d.refobjid AND da.attnum= d.refobjsubid WHERE LOWER(nsp.nspname)=LOWER(a_SchemaName) AND LOWER(tbl.relname)=LOWER(a_TableOID) AND tbl.relkind = 'r' AND pseq.relkind = 'S' ORDER BY pseq.relname;
Una descripción de una secuencia única es una combinación de un registro en pg_class que lo describe como una relación física y una tabla condicional con el nombre de la secuencia que contiene datos sobre las características específicas de la secuencia.
La información sobre la relación entre la secuencia y la tabla fuente se almacena en el directorio del sistema pg_depend .
Tabla 13. Atributos del directorio pg_depend necesarios para implementar la función.Titulo | Descripción |
---|
objid | OID de secuencia en el directorio pg_class |
objsubid | Este campo contiene cero |
refobjid | OID de la tabla en los campos de los cuales se usa la secuencia |
refobjsubid | Número de atributo de tabla cuyos valores se rellenan utilizando una secuencia |
Además, la función accede a los datos del catálogo pg_namespace y pg_description para extraer los diagramas y comentarios de la secuencia y la tabla fuente.
Para determinar el atributo de una tabla cuyos valores se llenan usando una secuencia, la función accede al directorio pg_attribute bajo la condición: attrelid = refobjid AND attnum = refobjsubid . (En esta condición, los nombres de los atributos del directorio pg_depend se indican a la derecha del signo igual).
Las características especiales de las secuencias de tablas se recuperan en un bucle llamando a admtf_Sequence_Features . El ciclo se usa porque se puede asignar más de una secuencia para completar los campos de la tabla.
Tabla 14. El resultado de ejecutar la función admtf_Table_Sequences ('public', 'kr_road_network_vertices_pgr').Titulo | Comentario | Inicio | Incremento | El final | El campo |
---|
kr_road_network _vertices_pgr_id _seq | Secuencia que genera valores de campo de identificación | 1 | 1 | 9223372036854775807 | id |
Versión sin cursor
En un entorno PostgreSQL cuya versión es inferior a 10, lo más probable es que sea imposible implementar la función admtf_Table_Sequences sin usar un cursor.
Pero los afortunados propietarios de la versión 10 pueden prescindir de un cursor, porque tienen el directorio pg_sequence a su disposición. En este caso, todas las características de la secuencia se pueden recuperar con una sola instrucción SELECT .
En la implementación de la función dada, usando la función de ventana RANK () OVER (PARTITION BY pseq.relname) , se calcula el número de secuencia de la secuencia utilizada para llenar la tabla fuente.

El código fuente del operador en la figura SELECT RANK() OVER (PARTITION BY pseq.relname) AS SequenceNo, pseq.relname AS SequenceName,snsp.nspname AS SequenceSchemaName, COALESCE(dsc.description,', ' ||da.attname) AS SequenceDescription, seq.seqstart AS SequenceStartValue,seq.seqincrement AS SequenceIncrementBy, seq.seqmax AS SequenceMaxValue, d.depType AS DependcyType,da.attname AS AttributeName FROM pg_depend d INNER JOIN pg_class pseq ON d.objid = pseq.oid INNER JOIN pg_sequence seq ON seq.seqrelid= pseq.oid INNER JOIN pg_namespace snsp ON pseq.relnamespace=snsp.oid LEFT OUTER JOIN pg_Description dsc ON pseq.oid=dsc.objoid AND dsc.objsubid=0 INNER JOIN pg_class tbl ON d.refobjid = tbl.oid INNER JOIN pg_namespace nsp ON tbl.relnamespace=nsp.oid INNER JOIN pg_attribute da ON da.attrelid= d.refobjid AND da.attnum= d.refobjsubid WHERE LOWER(nsp.nspname)=LOWER(a_SchemaName) AND LOWER(tbl.relname)=LOWER(a_TableOID) AND tbl.relkind = 'r' AND pseq.relkind = 'S' ORDER BY pseq.relname;
Observación 7
.
Esta versión de la función no devuelve el último valor generado por la secuencia ( last_value ).
El final del comentario.
Función Admtf_Table_InheritanceChildrens: lista de características de tablas heredadas
La función admtf_Table_InheritanceChildrens devuelve una lista de características de las tablas heredadas ( INHERITS ) de la tabla de la base de datos. El código fuente se puede ver y descargar aquí .
Como parámetros, la función toma el nombre de la tabla fuente ( a_TableName ) y el nombre del esquema dentro del cual se crea la tabla ( a_SchemaName ).
La descripción de una única tabla heredada se encuentra en la entrada en pg_class . Pero para buscar tablas heredadas por el nombre de la tabla fuente, debe usar el catálogo del sistema pg_depend .
Tabla 15. Atributos del directorio pg_depend necesarios para implementar la función.Titulo | Descripción |
---|
objid | OID de la tabla heredada en el directorio pg_class |
refobjid | OID de la tabla fuente |

El código fuente del operador en la figura SELECT rtbl.relname,rnspc.nspname,rdsc.description,rtbl.relnatts::INTEGER, rtbl.relchecks::INTEGER, rtbl.relhaspkey,rtbl.relhasindex,rtbl.relhassubclass, rtbl.reltuples::INTEGER FROM pg_class tbl INNER JOIN pg_namespace nspc ON tbl.relnamespace = nspc.oid LEFT OUTER JOIN pg_Description dsc ON tbl.oid=dsc.objoid AND dsc.objsubid=0 INNER JOIN pg_depend dp ON tbl.oid=dp.refobjid INNER JOIN pg_class rtbl ON rtbl.OID=dp.objid INNER JOIN pg_namespace rnspc ON rtbl.relnamespace = rnspc.oid LEFT OUTER JOIN pg_Description rdsc ON rtbl.oid=rdsc.objoid AND rdsc.objsubid=0 WHERE LOWER(nspc.nspname)=LOWER(a_SchemaName) AND LOWER(tbl.relname)=LOWER(a_TableOID) AND tbl.relkind = 'r' AND rtbl.relkind = 'r' ORDER BY rtbl.relname;
Además, la función accede a los datos del directorio pg_namespace y pg_description para extraer esquemas y comentarios para la tabla heredada y la fuente.
Tabla 16. El resultado de ejecutar la función admtf_Table_InheritanceChildrens ('public', 'np_house').Titulo | Comentario | Atributos | ? clave primaria | ? índices | ? descendientes | Numero de registros |
---|
np_house 04201 000000 | Casas en asentamientos (distrito de Achinsky) | 15 | f | f | f | 5651 |
np_house 4208 000 000 | Casas en asentamientos (distrito de Bogotolsky) | 15 | f | f | f | 4314 |
El número de registros en la tabla generada se selecciona del atributo reltuple del directorio pg_class. Y aunque este valor a menudo coincide exactamente con el número real de entradas en la tabla, sigue siendo un valor estimado. Por lo tanto, es posible que desee obtener el valor exacto como resultado. Por ejemplo, como se muestra en la figura.
EXECUTE 'SELECT COUNT(*) FROM '||LOWER(a_SchemaName)||'.'||LOWER(a_TableName) INTO v_TableNumberOfRowCalc;
Pero, en primer lugar, para cumplir con esta declaración en el texto, la función admtf_Table_InheritanceChildrens tendrá que usar un cursor.
En segundo lugar, me gustaría que la función muestre el número estimado y el número exacto de entradas de la tabla.
Por lo tanto, la función tiene otro parámetro opcional: el modo de obtener el número de entradas de la tabla ( a_Mode ), que toma los valores "estimar" ( estimar ) o "exactamente" ( exactamente ).
Además, se creó la función admfn_Table_RowCount , que devuelve el número exacto de entradas de la tabla, y el atributo reltuple se reemplaza en la lista de retorno SELECT con la siguiente construcción.

El código fuente del operador en la figura CASE WHEN a_Mode = 'exactly' THEN admfn_Table_RowCount(rnspc.nspname,rtbl.relname) ELSE reltuples END
Como resultado, la función devuelve el valor estimado del indicador "número de entradas de tabla" si el parámetro a_Mode no especifica el requisito para devolver el valor exacto.
Estructura de una función que devuelve una lista de características de atributos de tabla
Fig. 3. Funciones que admtf_Attribute_Features Calls
versión de texto de la tabla en la figuraTabla 17. Propósito de las funciones.No | Titulo | Cita |
---|
1 | admtf_Attribute_PKFeatures | La función devuelve el atributo de presencia de atributo en la clave primaria (CLAVE PRIMARIA), así como algunas de sus características como parte de esta clave. |
2 | admtf_Attribute_FKFeatures | La función devuelve el atributo de presencia de atributo en la clave externa (CLAVE EXTRANJERA), así como algunas de sus características como parte de esta clave. |
3 | admtf_Attribute_Features | La función devuelve una lista de características de atributos de tabla. |
Función admtf_Attribute_PKFeatures : si el atributo está presente en la clave primaria
La función admtf_Attribute_PKFeatures devuelve un signo de la presencia de un atributo de tabla en la clave primaria (PRIMARY KEY) de la tabla y, si está presente, cuál es su número de serie en esta clave, ya que La clave primaria puede ser compuesta.
El código fuente se puede ver y descargar aquí .
Como parámetros, la función toma el OID de la tabla fuente ( a_TableOID ) y el número de serie del atributo deseado ( a_AttributeNo ).
La función extrae los datos requeridos de la entrada del directorio pg_constraint que contiene las restricciones (CONSTRAINT) de la tabla de origen, incluida la restricción de clave principal. El OID de la tabla deseada se almacena en el campo conrelid , la descripción de la clave primaria se almacena en un registro en el que el campo contype contiene el valor '' p '
.
SELECT INTO v_PKAttributeList,rs_isAttributePK conkey,ARRAY[a_AttributeNo]<@conkey FROM pg_constraint c WHERE c.contype='p' AND c.conrelid=a_TableOID;
El campo conkey , que se encuentra de esta manera, contiene una matriz de números de atributos que constituyen la clave primaria. Por lo tanto, para verificar la presencia del atributo de origen en la clave primaria, es suficiente calcular la expresión lógica ARRAY [a_AttributeNo] <@ conkey .
Si el atributo está presente en la clave primaria, su número de secuencia se calcula en el bucle.
Función admtf_Attribute_FKFeatures : si el atributo está presente en la clave externa
La función admtf_Attribute_FKFeatures devuelve un signo de la presencia de un atributo de tabla en una o más claves foráneas (FOREIGN KEY) de la tabla y, si está presente, cuáles son sus números de secuencia en estas claves, porque La clave externa puede ser compuesta.
El código fuente se puede ver y descargar aquí .
Como parámetros, la función toma el OID de la tabla fuente ( a_TableOID ) y el número de serie del atributo deseado ( a_AttributeNo ).
La función recupera los datos requeridos de la entrada del directorio pg_constraint que contiene la CONSTRAINT de la tabla de origen, incluidas, entre otras, restricciones de clave externa. El OID de la tabla deseada se almacena en el campo conrelid , la descripción de la clave primaria se almacena en un registro en el que el campo contype contiene el valor '' f '
.
SELECT * FROM pg_constraint c WHERE c.contype='f ' AND c.conrelid=a_TableOID AND ARRAY[a_AttributeNo]<@conkey ORDER BY c.oid;
El campo conkey , que se encuentra de esta manera, contiene una matriz de números de atributos que forman la clave foránea. Por lo tanto, para verificar la presencia del atributo de origen en la clave externa, es suficiente calcular la expresión lógica ARRAY [a_AttributeNo] <@ conkey .
Si el atributo está presente en la clave externa, entonces en el bucle se forma una matriz de sus números de secuencia en las claves externas que lo contienen. Además, se forman dos matrices más a partir de los nombres de las tablas y sus atributos, a los que hace referencia el atributo de origen en las claves externas que lo contienen.
Los nombres de tabla se recuperan de la entrada del directorio pg_class por identificador (OID) recuperado del campo confrelido de la entrada de clave externa.
Para obtener el nombre del atributo de la tabla externa, use una matriz de números de serie del campo
confkey
(difiere de la matriz anterior por la letra "
f " en el nombre). El número de serie del atributo de la tabla externa a la que corresponde el atributo externo se extrae de esta matriz. Mediante este número de serie del atributo de la tabla externa y su OID, ubicado en el directorio pg_attribute, hay una entrada para la descripción del atributo y se recupera su nombre.
Función Admtf_Attribute_Features : lista de características de atributos de tabla
Las funciones admtf_Attribute_Features devuelven una lista de las siguientes características de atributos de tabla. El código fuente se puede ver y descargar aquí .

La versión de texto de la tabla en la figura.No | Titulo | Tipo | Cita |
---|
1 | Nombre de atributo | nombre | El nombre del atributo de origen. |
2 | UserTypeName | VARCHAR (256) | Tipo de atributo de origen personalizado |
3 | Nombre de tipo | VARCHAR (256) | Tipo base de atributo fuente |
4 4 | isNotNULL | Booleano | ? Validez nula |
5 5 | isAttributePK | Booleano | ? participación en PK |
6 6 | Columna PK No | SMALLINT | Número de serie del atributo en PK |
7 7 | Descripción | Texto | Comentario sobre el atributo de origen |
8 | isAttributeFK | Booleano | ? participación en FK |
9 9 | FKeyName | nombre [] | Una matriz de nombres de tabla de restricciones en la que se define la clave externa |
10 | ColumnaFKNo | SMALLINT [] | Matriz de números de secuencia de atributos en claves foráneas de una tabla |
11 | FKTableName | nombre [] | Matriz de tablas referenciadas por claves foráneas |
12 | FKTableColumnName | nombre [] | Matriz de nombres de atributos en tablas externas correspondientes al atributo de origen |
Como parámetros, la función toma el OID de la tabla fuente ( a_TableOID ) y el número de serie del atributo deseado ( a_AttributeNo ).
Los valores de los campos AttributeName e isNotNULL se recuperan de la entrada del directorio pg_attribute correspondiente a los valores de los parámetros de entrada.
SELECT attr.attname, attr.attnotnull FROM pg_attribute attr WHERE attr.attrelid =a_TableOID AND attr.attnum=a_AttributeNo; SELECT rs_isAttributePK,rs_ColumnPKNo FROM admtf_Attribute_PKFeatures (a_TableOID,a_AttributeNo); SELECT rs_isAttributeFK,rs_FKeyName,rs_ColumnFKNo, rs_FKTableName,rs_FKTableColumnName FROM admtf_Attribute_FKFeatures (a_TableOID,a_AttributeNo);
La función admtf_Attribute_PKFeatures devuelve los valores de los campos isAttributePK y ColumnPKNo .
La función admtf_Attribute_FKFeatures devuelve los valores de los campos isAttributeFK , FKeyName , ColumnFKNo , FKTableName , FKTableColumnName .
Una llamada a admtf_Attribute_Features ((SELECCIONE OID DE pg_class WHERE relname = 'street'), 2 :: SMALLINT) producirá el siguiente resultado.
Tabla 18. Resultado de ejecutar la función admtf_Attribute_FeaturesNombre de atributo | UserTypeName | Nombre de tipo | isNotNULL | isAttributePK | Columna PK No |
---|
localityid | localityid | entero | entero | entero | entero |
Descripción | isAttributeFK | FKeyName | ColumnaFKNo | FKTableName | FKTableColumnName |
---|
ID de comunidad | t | {fk_street_locality} | {2} | {localidad} | {localityid} |
APÉNDICE 1. Scripts
Creación de la función admtf_Sequence_Features
Los comentarios sobre el código fuente de la función se pueden encontrar aquí.código de función BEGIN TRANSACTION; DROP FUNCTION IF EXISTS admtf_Sequence_Features (a_SchemaName NAME,a_SequenceName NAME); CREATE OR REPLACE FUNCTION admtf_Sequence_Features (a_SchemaName NAME default 'public', a_SequenceName NAME default NULL ) RETURNS TABLE (rs_SequenceName NAME,rs_SequenceDescription TEXT,rs_NumberOfAttribute INTEGER,rs_SequenceLastValue BIGINT, rs_SequenceStartValue BIGINT,rs_SequenceIncrementBy BIGINT,rs_SequenceMaxValue BIGINT) AS $BODY$ DECLARE c_SequenceKind CONSTANT CHAR:='S'; v_SequenceOID OID; v_SequenceName NAME; v_SequenceDescription TEXT; v_SequenceStartValue BIGINT; v_SequenceIncrementBy BIGINT; v_SequenceMaxValue BIGINT; v_SequenceLastValue BIGINT; v_SequenceNumberOfRowCalc INTEGER;
Creación de la función admtf_Table_Sequences
Los comentarios sobre el código fuente de la función se pueden encontrar aquí.código de función BEGIN TRANSACTION; DROP FUNCTION IF EXISTS admtf_Table_Sequences (a_SchemaName NAME, a_TableName NAME); CREATE OR REPLACE FUNCTION admtf_Table_Sequences (a_SchemaName NAME default 'public', a_TableName NAME default NULL ) RETURNS TABLE (r_SequenceNumber SMALLINT,r_SequenceName NAME, r_SequenceSchemaName NAME,r_SequenceDescription TEXT, r_SequenceStartValue BIGINT,r_SequenceIncrementBy BIGINT, r_SequenceMaxValue BIGINT,r_DependType NAME, r_RefTableName NAME,r_RefTableSchemaName NAME, r_RefAttributeName NAME) AS $BODY$ DECLARE v_TableOID INTEGER; v_Sequence RECORD; v_SequenceOID INTEGER; v_SequenceName NAME; v_SequenceSchemaName NAME; v_SequenceDescription TEXT; v_SequenceStartValue BIGINT; v_SequenceIncrementBy BIGINT; v_SequenceMaxValue BIGINT; v_DependcyType NAME; v_AttributeName NAME; v_SequenceNumber SMALLINT; c_Delimiter CONSTANT VARCHAR(2):=',';
admtf_Table_Sequences (PostgreSQL 10)
. BEGIN TRANSACTION; DROP FUNCTION IF EXISTS admtf_Table_Sequences (a_SchemaName NAME, a_TableName NAME); CREATE OR REPLACE FUNCTION admtf_Table_Sequences (a_SchemaName NAME default 'public', a_TableName NAME default NULL ) RETURNS TABLE (r_SequenceNumber SMALLINT,r_SequenceName NAME, r_SequenceSchemaName NAME,r_SequenceDescription TEXT, r_SequenceStartValue BIGINT,r_SequenceIncrementBy BIGINT, r_SequenceMaxValue BIGINT,r_DependType NAME, r_RefTableName NAME,r_RefTableSchemaName NAME, r_RefAttributeName NAME) AS $BODY$ DECLARE v_TableOID INTEGER; v_Sequence RECORD; v_SequenceOID INTEGER; v_SequenceName NAME; v_SequenceSchemaName NAME; v_SequenceDescription TEXT; v_SequenceStartValue BIGINT; v_SequenceIncrementBy BIGINT; v_SequenceMaxValue BIGINT; v_DependcyType NAME; v_AttributeName NAME; v_SequenceNumber SMALLINT; c_Delimiter CONSTANT VARCHAR(2):=',';
admfn_Table_RowCount
. BEGIN TRANSACTION; DROP FUNCTION IF EXISTS admfn_Table_RowCount (a_SchemaName NAME,a_TableName NAME); CREATE OR REPLACE FUNCTION admfn_Table_RowCount (a_SchemaName NAME default 'public', a_TableName NAME default NULL ) RETURNS BIGINT AS $BODY$ DECLARE v_TableNumberOfRowCalc BIGINT; v_Found BOOLEAN;
admtf_Table_InheritanceChildrens
. BEGIN TRANSACTION; DROP FUNCTION IF EXISTS admtf_Table_InheritanceChildrens (a_SchemaName NAME,a_TableName NAME,a_Mode VARCHAR(10)); CREATE OR REPLACE FUNCTION admtf_Table_InheritanceChildrens (a_SchemaName NAME default 'public', a_TableName NAME default NULL, a_Mode VARCHAR(10) default 'estimate' ) RETURNS TABLE (rs_TableName NAME,rs_TableDescription TEXT, rs_NumberOfAttribute INTEGER,rs_NumberOfChecks INTEGER, rs_hasPKey BOOLEAN,rs_hasIndex BOOLEAN, rs_hasSubClass BOOLEAN,rs_NumberOfRow INTEGER) AS $BODY$ DECLARE c_TableKind CONSTANT CHAR:='r'; c_ExactlyMode CONSTANT VARCHAR(10):='exactly'; c_EstimateMode CONSTANT VARCHAR(10):='estimate'; v_TableOID OID; v_SchemaName NAME; v_TableName NAME; v_TableDescription TEXT; v_TableNumberOfRowCalc INTEGER; v_InheritanceRECORD RECORD; v_InheritanceOID OID; BEGIN RETURN QUERY SELECT rtbl.relname,rdsc.description,rtbl.relnatts::INTEGER, rtbl.relchecks::INTEGER,rtbl.relhaspkey,rtbl.relhasindex, rtbl.relhassubclass, CASE WHEN a_Mode=c_ExactlyMode THEN admfn_Table_RowCount(rnspc.nspname,rtbl.relname)::INTEGER ELSE rtbl.reltuples::INTEGER END FROM pg_class tbl INNER JOIN pg_namespace nspc ON tbl.relnamespace = nspc.oid LEFT OUTER JOIN pg_Description dsc ON tbl.oid=dsc.objoid AND dsc.objsubid=0 INNER JOIN pg_depend dp ON tbl.oid=dp.refobjid INNER JOIN pg_class rtbl ON rtbl.OID=dp.objid INNER JOIN pg_namespace rnspc ON rtbl.relnamespace = rnspc.oid LEFT OUTER JOIN pg_Description rdsc ON rtbl.oid=rdsc.objoid AND rdsc.objsubid=0 WHERE nspc.nspname=LOWER(a_SchemaName) AND tbl.relkind=c_TableKind AND rtbl.relkind=c_TableKind AND tbl.relname =LOWER(a_TableName) ORDER BY rtbl.relname; END $BODY$ LANGUAGE plpgsql; COMMENT ON FUNCTION admtf_Table_InheritanceChildrens(a_SchemaName NAME,a_TableName NAME,a_Mode VARCHAR(10)) IS ' ';
admtf_Attribute_PKFeatures
. BEGIN TRANSACTION; DROP FUNCTION IF EXISTS admtf_Attribute_PKFeatures (a_TableOID OID,a_AttributeNo SMALLINT); CREATE OR REPLACE FUNCTION admtf_Attribute_PKFeatures (a_TableOID OID, a_AttributeNo SMALLINT ) RETURNS TABLE (rs_isAttributePK BOOLEAN,rs_PKeyName name,rs_ColumnPKNo SMALLINT) AS $BODY$ DECLARE C_PKAttributeList_NDims CONSTANT INTEGER:=1; v_PKAttributeList SMALLINT[]; v_PKAttributeIndx INTEGER; v_PKAttributeLBound INTEGER; v_PKAttributeUBound INTEGER;
admtf_Attribute_FKFeatures
. BEGIN TRANSACTION; DROP FUNCTION IF EXISTS admtf_Attribute_FKFeatures (a_TableOID OID,a_AttributeNo SMALLINT); CREATE OR REPLACE FUNCTION admtf_Attribute_FKFeatures (a_TableOID OID, a_AttributeNo SMALLINT ) RETURNS TABLE (rs_isAttributeFK BOOLEAN,rs_FKeyName name[],rs_ColumnFKNo SMALLINT[],rs_FKTableName name[],rs_FKTableColumnName name[]) AS $BODY$ DECLARE C_FKAttributeList_NDims CONSTANT INTEGER:=1; v_FKAttributeList SMALLINT[]; v_RefAttributeList SMALLINT[]; v_FKAttributeIndx INTEGER; v_RefAttributeListIndx INTEGER; v_FKAttributeLBound INTEGER; v_FKAttributeUBound INTEGER; v_FKConstraintIndx INTEGER; v_FKeyName name; v_FKTableName name; v_FKTableColumnName name; v_RefAttributeNo SMALLINT; v_Constraint pg_constraint%ROWTYPE;
admtf_Attribute_Features
. BEGIN TRANSACTION; DROP FUNCTION IF EXISTS admtf_Attribute_Features (a_TableOID OID,a_AttributeNo SMALLINT); CREATE OR REPLACE FUNCTION admtf_Attribute_Features (a_TableOID OID, a_AttributeNo SMALLINT ) RETURNS TABLE (rsa_AttributeName name,rsa_UserTypeName VARCHAR(256),rsa_TypeName VARCHAR(256),rsa_isNotNULL BOOLEAN,rsa_isAttributePK BOOLEAN, rsa_ColumnPKNo SMALLINT,rsa_Description Text,rsa_isAttributeFK BOOLEAN,rsa_FKeyName name[],rsa_ColumnFKNo SMALLINT[],rsa_FKTableName name[],rsa_FKTableColumnName name[]) AS $BODY$ DECLARE v_Return_Error Integer := 0;
Ver también
PostgreSQL. ;PostgreSQL. .PostgreSQL. ( ) .