微醺148 2024-07-05 16:26 采纳率: 0%
浏览 2
已结题

oracle自建方法报错

牛爷爷们我在Oracle想写一个方法getRowNum2,想仿照SPLIT方法输入‘3-6’通过 table(getRowNum2(‘3-6’)) 输出4行3\4\5\6来

create FUNCTION getRowNum2(string VARCHAR2, char VARCHAR2 := '-') return TYPE_SPLIT
    PIPELINED IS
    IDX     PLS_INTEGER;
    starNum PLS_INTEGER;
    endNum  PLS_INTEGER;
BEGIN
    IDX := instr(string, char);
    if IDX > 0 THEN
        starNum := to_number(substr(string, 1, IDX - 1));
        endNum := to_number(substr(string, IDX + 1, length(string)));
        WHILE (starNum < endNum)
            LOOP
                PIPE ROW (TO_CHAR(starNum));
                starNum := starNum + 1;
            end loop;
        RETURN;
    ELSE
        PIPE ROW (string);
    END IF;
    return;
end getRowNum2;
/

select * from TABLE ( getRowNum('77-88') );

但是报错
[65000][6575] ORA-06575: 程序包或函数 GETROWNUM 处于无效状态 Position: 22,能不能帮我看看啥问题

  • 写回答

1条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-07-05 16:26
    关注

    引自免费微信小程序:皆我百晓生

    从你给出的Oracle函数和报错信息来看,有几个问题和潜在错误点。我将帮助你修复它们:

    问题点:

    1. 函数名称不一致:你在调用函数时使用了getRowNum,但在创建函数时定义了getRowNum2。你需要确保调用时使用的函数名称与定义的名称一致。

    2. 函数返回类型TYPE_SPLIT未在代码中定义。你需要确保已经定义了这个类型或者使用一个适当的替代类型。如果这是一个表类型,确保它包含了正确的字段定义。

    3. Oracle函数中返回表类型的列使用PIPELINED是一个可选的方法,你的函数似乎并未遵循此方法来实现所需的返回格式,这可能导致错误。你需要使用PIPE ROW来逐行返回数据。

    修复后的代码示例如下:

    假设你有一个名为NUMBER_TABLE的表类型已经定义好,下面是一个可能的实现方式:

    CREATE OR REPLACE TYPE NUMBER_TABLE AS TABLE OF NUMBER;  -- 定义表类型NUMBER_TABLE
    CREATE FUNCTION getRowNumTableRange(rangeString VARCHAR2) RETURN NUMBER_TABLE PIPELINED IS
        startNum NUMBER;
        endNum NUMBER;
    BEGIN
        -- 解析输入字符串以获取起始和结束数字
        startNum := TO_NUMBER(SUBSTR(rangeString, 1, INSTR(rangeString, '-') - 1));
        endNum := TO_NUMBER(SUBSTR(rangeString, INSTR(rangeString, '-') + 1));
        -- 检查数值的有效性以避免转换异常的情况(比如输入是无效的字符串格式)
        IF startNum IS NOT NULL AND endNum IS NOT NULL THEN  -- 确保转换成功且数值有效
            FOR i IN startNum..endNum LOOP  -- 循环生成数字序列并返回每一行数据
                PIPE ROW (i);  -- 使用PIPE ROW逐行返回数据到结果集
            END LOOP;  -- 循环结束标志,用于确保生成整个序列范围的数据集
        ELSE  -- 如果起始或结束数值无效的情况处理(可以根据需求自行决定如何处理异常)
            RAISE VALUE_ERROR('Invalid range format.';  -- 例如抛出异常说明格式不正确或错误处理逻辑等(根据需要修改)
        END IF;  -- 结束条件判断语句块标志符(根据Oracle语法要求使用适当的结束标志)
    RETURN;  -- 返回结果集或空值等处理逻辑(根据实际需求调整)
    END getRowNumTableRange;  -- 函数名需要匹配创建时的名称(这里是getRowNumTableRange)并且确保调用时保持一致名称和参数列表格式。 示例中函数名称为getRowNumTableRange而非getRowNum2,并且返回类型为定义的表类型NUMBER_TABLE。你可以根据需要调整函数名和返回类型。调用时请确保函数名和参数匹配即可。在Oracle SQL查询中使用此函数的例子可能如下所示: SELECT COLUMN_VALUE FROM TABLE ( getRowNumTableRange('3-6') ); 这将返回一个包含从3到6数字的查询结果集。如果遇到具体的语法或调用问题,请参考Oracle的官方文档或其他资源以确保代码的正确性和完整性。另外,如果表类型已预先定义且已经包括在你的数据库中,可以直接引用表类型名称而无需再次定义。请确保你的数据库环境中已经包含了正确的表类型和相应的定义。
    
    评论 编辑记录

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 7月5日
  • 创建了问题 7月5日

悬赏问题

  • ¥15 有关类的报错,在模块里调用另一个模块的方法下的变量时出错
  • ¥15 delphi7 HMAC_SHA256方式加密
  • ¥15 关于#qt#的问题:我想实现qcustomplot完成坐标轴
  • ¥15 下列c语言代码为何输出了多余的空格
  • ¥15 kali linux用wget archive.kali.org/archive-key.asc指令下载签名无效(失败)
  • ¥15 openHarmony 利用c++程序在dayu210开发板上实现拉取RTSP视频流并且在屏幕上显示
  • ¥15 GD32H757的can通信配置
  • ¥20 nist随机数测试的问题
  • ¥20 帮我解决这个项目,thank you各位程序员
  • ¥15 哪位能用ea软件做一下,有偿