Firebird 2.5.x.从存储过程中提取结果的列名和列数据类型

时间:2013-10-21 12:16:52

标签: firebird firebird2.5

我有一个Firebird 2.5数据库。作为一个例子,我有一个名为QRESULT的存储过程,预期返回为:

Parameter  - DATATYPE

a          - date
b          - numeric(18,0)
c          - integer
d          - varchar(50)

依旧......

我使用PHP - PDO使用QRESULT这样的程序查询firebird数据库:

SELECT a,b,d from QRESULT() where a = "some value"

我需要在QRESULT过程之前运行一些查询,我需要它来返回QRESULT在运行时将返回的所有列的数据类型。所以我可以帮助用户为我的“where”子句键入正确的值。我知道我可以在用户界面中手动设置,但在实际项目中有很多程序,如果有办法,我可以使我的过滤器接口动态生成我会很高兴。如果这对于存储过程是不可能的,我可以使用select语句。我只需要一些线索。

1 个答案:

答案 0 :(得分:2)

您想要的信息在RDB$PROCEDURE_PARAMETERS表中,基本上您需要的是查询

SELECT r.RDB$PARAMETER_NAME ParName, F.RDB$FIELD_TYPE ParType
FROM RDB$PROCEDURE_PARAMETERS r
JOIN RDB$FIELDS F ON(F.RDB$FIELD_NAME = R.RDB$FIELD_SOURCE)
WHERE  r.RDB$PROCEDURE_NAME = 'QRESULT'
   AND r.RDB$PARAMETER_TYPE = 1
ORDER BY r.RDB$PARAMETER_TYPE, r.RDB$PARAMETER_NUMBER

请注意,SP名称应为大写,因为它是存储在系统表中的方式(除非您使用带引号的标识符)。如果要同时获取输入和输出参数,请从r.RDB$PARAMETER_TYPE = 1中删除WHERE谓词(类型0是输入参数,输出1)。

此查询返回的类型是类型的整数id,快速谷歌搜索发现:

14,"TEXT "
7,"SHORT "
8,"LONG "
9,"QUAD "
10,"FLOAT "
27,"DOUBLE "
35,"TIMESTAMP "
37,"VARYING "
261,"BLOB "
40,"CSTRING "
45,"BLOB_ID "
12,"DATE "
13,"TIME "
16,"INT64 "

但是如果你想要更精确的类型,那么see this SO post