我有一个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语句。我只需要一些线索。
答案 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。