如何在 Firebird 中正确处理此查询

问题描述 投票:0回答:1

据我搜索和查看文档,以下查询应该会成功。

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]

我看不出它所指向的地方有什么问题。我已经重写了三遍了。

我需要更改什么才能使查询有效?

sql firebird
1个回答
0
投票

您的函数看起来更像是用 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()

© www.soinside.com 2019 - 2024. All rights reserved.