据我搜索和查看文档,以下查询应该会成功。
CREATE OR ALTER FUNCTION func_string_de_processos(p_num_processo int)
RETURNS BLOB
AS
DECLARE VARIABLE text BLOB;
DECLARE c1 CURSOR FOR
(SELECT vap.NOME_ANEXO AS nome
FROM VW_ANEXOS_PROCESSOS vap
WHERE vap.CODIGO_PROCESSO = :p_num_processo);
BEGIN
text = '';
OPEN c1;
WHILE(1=1) DO
BEGIN
FETCH c1 INTO :current_value;
IF (ROW_COUNT = 0) THEN
LEAVE;
IF (ROW_COUNT = 1) THEN
text = text || current_value;
ELSE
text = texto || current_value || ' OR ';
END
CLOSE c1;
RETURN text;
END
我想将一些文本连接到一个变量并返回,所以我创建了这个函数,虽然它似乎(至少对我来说,有任何逻辑问题)无法编译。
这个错误不断出现,但它没有给我太多细节:
Erro SQL [335544851] [42000]:动态 SQL 错误; SQL错误代码= -104;命令行意外结束 - 第 4 行第 23 列 [SQLState:42000,ISC 错误代码:335544851]
我看不出它所指向的地方有什么问题。我已经重写了三遍了。
我需要更改什么才能使查询有效?
您的函数看起来更像是用 Oracle PL/SQL 而不是 Firebird PSQL 编写的。
在 Firebird 中它可能看起来像这样:
CREATE OR ALTER FUNCTION func_string_de_processos(p_num_processo int)
RETURNS BLOB
AS
DECLARE VARIABLE text BLOB;
DECLARE VARIABLE nome TYPE OF COLUMN VW_ANEXOS_PROCESSOS.NOME_ANEXO;
BEGIN
text = '';
FOR SELECT NOME_ANEXO
FROM VW_ANEXOS_PROCESSOS
WHERE CODIGO_PROCESSO = :p_num_processo
INTO :nome DO
BEGIN
IF (text = '')
text = :nome
ELSE
text = text || :nome || ' OR ';
END
END
但是考虑到您的查询没有 ORDER BY 子句 - 整个函数的功能与内置函数完全相同LIST()。