在 PL/SQL 存储过程中拆分逗号分隔的字符串

2024-04-08

我有 CSV 字符串 100.01,200.02,300.03,我需要将其传递给 Oracle 中的 PL/SQL 存储过程。 在过程中,我需要将这些值插入表中的数字列中。

为此,我从这里得到了一个工作方法:

如何在 oracle 9i 中最好地分割 csv 字符串 https://stackoverflow.com/questions/1089508/how-to-best-split-csv-strings-in-oracle-9i

[2) 使用SQL的按级别连接]。

现在,我还有另一个要求。 我需要传递 2 个 CSV 字符串[长度相等]作为 PL/SQL 存储过程的输入。并且,我需要断开该字符串并将两个 CSV 字符串中的每个值插入到表中的两个不同列中。您可以让我吗?知道该怎么做吗?

CSV 输入示例: mystring varchar2(2000):='0.75, 0.64, 0.56, 0.45';

myAmount varchar2(2000):= '0.25, 0.5, 0.65, 0.8';

myString 值将进入表中的 A 列,myAmount 值将进入 B 列。

您能让我知道如何实现这一目标吗?

Thanks.


这应该可以满足您的需求。它假设您的列表始终只是数字。如果不是这种情况,只需将对 DBMS_SQL.NUMBER_TABLE 的引用更改为适用于所有数据的表类型:

CREATE OR REPLACE PROCEDURE insert_from_lists(
    list1_in IN VARCHAR2,
    list2_in IN VARCHAR2,
    delimiter_in IN VARCHAR2 := ','
)
IS 
    v_tbl1 DBMS_SQL.NUMBER_TABLE;
    v_tbl2 DBMS_SQL.NUMBER_TABLE;

    FUNCTION list_to_tbl
    (
        list_in IN VARCHAR2
    )
    RETURN DBMS_SQL.NUMBER_TABLE
    IS
        v_retval DBMS_SQL.NUMBER_TABLE;
    BEGIN

        IF list_in is not null
        THEN
            /*
            || Use lengths loop through the list the correct amount of times,
            || and substr to get only the correct item for that row
            */
            FOR i in 1 .. length(list_in)-length(replace(list_in,delimiter_in,''))+1
            LOOP
                /*
                || Set the row = next item in the list
                */
                v_retval(i) := 
                        substr (
                            delimiter_in||list_in||delimiter_in,
                            instr(delimiter_in||list_in||delimiter_in, delimiter_in, 1, i  ) + 1,
                            instr (delimiter_in||list_in||delimiter_in, delimiter_in, 1, i+1) - instr (delimiter_in||list_in||delimiter_in, delimiter_in, 1, i) -1
                        );
            END LOOP;
        END IF;

        RETURN v_retval;

    END list_to_tbl;
BEGIN 
   -- Put lists into collections
   v_tbl1 := list_to_tbl(list1_in);
   v_tbl2 := list_to_tbl(list2_in);

   IF v_tbl1.COUNT <> v_tbl2.COUNT
   THEN
      raise_application_error(num => -20001, msg => 'Length of lists do not match');
   END IF;

   -- Bulk insert from collections
   FORALL i IN INDICES OF v_tbl1
      insert into tmp (a, b)
      values (v_tbl1(i), v_tbl2(i));

END insert_from_lists; 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 PL/SQL 存储过程中拆分逗号分隔的字符串 的相关文章

随机推荐

  • 如何检索 MongoDb 集合验证器规则?

    在 MongoDB 3 4 4 上 我创建了一个带有验证器的集合 但现在某些插入不符合此规则 我不明白为什么 有没有办法输出验证器的规则 恐怕适用的规则与我认为的不同 有没有办法改善错误消息 在这种情况下 文档验证失败 是毫无用处的 谢谢你
  • Android蓝牙更改UUID后未发现特征

    我正在使用 Android 5 0 1 Lollipop 并开发蓝牙低功耗服务器 客户端通信 我有三星 Galaxy s4 我的定制服务具有三个特点 我将该特性的属性之一设置为只写和加密写入 然后我将其更改为非加密写入 写操作不再适用于此特
  • 使用 SSL 找不到证书路径的信任锚

    你好 我尝试在 Android 上与 SSL 握手 但收到此错误 10 21 15 39 33 279 W System err 500 javax net ssl SSLHandshakeException java security c
  • 在 Spring 3.2 和 Thymeleaf 2.1.3 中使用多个模板解析器来处理电子邮件

    我在定义 a 时遇到问题ClassLoaderTemplateResolver用于电子邮件和一个ServletContextTemplateResolver用于网络浏览量 我在尝试发送电子邮件时收到以下错误 HTTP Status 500
  • 关闭连接是最终确定最佳实践吗? [复制]

    这个问题在这里已经有答案了 可能的重复 为什么要实现finalize https stackoverflow com questions 158174 why would you ever implement finalize 我看到一些j
  • 将字符串转换为内存流 - 内存流不可扩展?

    我试图将一个字符串写入内存流 但失败并出现错误消息 Memory stream is not expandable 产生此问题的代码行 context Response Filter new System IO MemoryStream S
  • ViewPager onPageSelected 为第一页

    因此 当使用 ViewPager 时 不会为第一页调用 onPageSelected 侦听器 问题与this http code google com p android issues detail id 27526 我有一些逻辑为当前选定
  • Vim:突出显示每种文件类型的 TODO 一词

    我想在 vim 中突出显示 TODO 这个词 无论编辑什么文件 代码或普通文本 它目前适用于许多不同的语言 例如 默认情况下 TODO 在 C Java 注释中突出显示 但我将 vim 用于非代码文本文件 并且我希望看到它们也突出显示 TO
  • 使用 Hibernate 预防 SQL 注入

    我有一个现有的代码 其中应用程序根据许多条件生成不同的 sql 并通过 hibernate 会话 createSQLQuery 执行它们 在这里 参数与驻留在 java 类中的 sql 字符串连接 作为普通字符串替换 现在的问题是我需要防止
  • 运行 fatjar 时无法加载 log4j2

    我正在开发一个使用 log4j2 日志记录的项目 在 intellij 中开发时 一切正常 并且日志记录按预期完成 log4j2 xml 通过在启动时通过 intellij 设置传递给 jvm 的 java 属性进行链接 但是一旦我尝试运行
  • 如何在 GKE 上配置 Ingress 请求超时

    我目前在 GKE k8s 1 2 上配置了一个 Ingress 用于将请求转发到我的应用程序的 Pod 我有一个可能需要很长时间的请求 30秒 和我的应用程序超时 504 我观察到 这样做时 我收到的响应不是我自己的 504 而是来自看起来
  • 机架 Web 服务器和 https:教程?

    任何人都可以提供使用 Ruby RACK Web 服务器处理 https 和 installint 证书等设置的描述或教程的链接吗 Thanks Rack 不是网络服务器 它是网络服务器 如 Apache nginx 和应用程序中间件之间的
  • 我可以获得`FILE*`的访问模式吗?

    我必须复制一个FILE Mac OS X 上的 C 语言 使用 POSIXint不幸的是 文件描述符一直是不可能的 所以我想出了以下函数 static FILE fdup FILE fp const char mode int fd fil
  • iPhone X中为什么页面推送动画Tabbar上移

    我构建了一个应用程序演示 在推送动画中使用 hidesBottomBarWhenPushed 隐藏 Tabbar But When I click Jump Button Tabbar move up like this VoidLess
  • 用于具有数字签名的 WSSecurity 的 SOAPHandler

    我正在尝试在 java 中创建一个 Soap 客户端 我必须使用我的私钥对 Soap 消息进行签名 我正在使用得到回复SoapUI with WS Security配置 我已导入 WSDL 并使用生成的类wsimport 我创建了一个SOA
  • 要安装 OpenType 字体,Windows 有哪些要求?

    利基编程问题 我正在通过字节制作来开发 OpenType 字体 而不是使用 Fontlab 或 FontForge 等设计工具 现在有一个自定义 OpenType CFF 字体 它实现了 Basic Latin unicode 块的子集 特
  • 让宏定义为函数返回值是不好的做法吗?

    使用定义为有条件返回值的宏有一个缺点 即仅查看客户端代码可能会在宏处退出 这一点并不明显 我正在考虑的用例是编写值和错误检查 如下所示 define WRITE CHK file param if write that returns ze
  • POST 请求中的 %5B 和 %5D 代表什么?

    我正在尝试编写一个Java 类来登录某个网站 登录的POST请求中发送的数据是 user 5Blogin 5D username user 5Bpassword 5D 123456 我很好奇是什么 5B and 5D意味着在钥匙用户登录 我
  • AWS Redis 从外部连接

    有没有办法从外部 AWS 网络连接 AWS 上托管的 Redis 实例 我有一个基于 Windows 的 EC2 实例在 AWS 上运行 另一个是 Redis 缓存节点 我知道有人问过这个问题 但答案是在基于 Linux 的系统中 但我的是
  • 在 PL/SQL 存储过程中拆分逗号分隔的字符串

    我有 CSV 字符串 100 01 200 02 300 03 我需要将其传递给 Oracle 中的 PL SQL 存储过程 在过程中 我需要将这些值插入表中的数字列中 为此 我从这里得到了一个工作方法 如何在 oracle 9i 中最好地