尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
Oracle Pipelined Table Functions 的 split 教程,这次让 Codex 走 TaoToken 验证 PIPE ROW 返回
在实际项目中想让 PL/SQL 函数返回多行常见做法是返回 REF CURSOR 或者把结果先装进一个集合。REF CURSOR 只能从查询里取现成的行集合又必须在RETURN 前把数据全部“攒齐”。Oracle 9i 引入的管道化表函数Pipelined Table Functions改变了这个局面函数边算边吐每算出一行就通过 PIPE ROW 发出去数据可以尽快被消费。原文用 fn_split 演示了这种用法把 1;;12;;123;;1234;;12345 按 ;; 拆成五行再由 TABLE 操作符接收。今天我在整理这段 Oracle 代码时顺手让 Codex 走 TaoToken 验证 PIPE ROW 的返回顺序——先打开 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_end 创建 API Key再把 Codex 的 Base URL 填成 https://taotoken.net/api让 Codex 帮忙检查循环边界和 COLUMN_VALUE 的输出整个过程比想象中顺畅。1. fn_split 为什么要用 PIPE ROW而不是拼完一次性返回管道化表函数的核心差异在于“返回时机”。普通函数必须等集合完全填充后才能整体返回数据量一大就很浪费。fn_split 这种按分隔符拆字符串的场景非常适合管道化处理INSTR 找到一个分隔符就切出一段子串立刻 PIPE ROW 吐出去不需要等后面几千个分隔符全都处理完。fn_split 的声明有三处关键点。RETURN 类型必须是集合这里是 ty_str_split即 VARCHAR2(4000) 的表类型。函数本体加上 PIPELINED 关键字告诉 Oracle 这个函数可以边算边吐。函数体内用 PIPE ROW(str) 抛出行数据逻辑处理完后以一个空的 RETURN 语句结束表示“没有更多行了”。把 fn_split 和普通函数放在一起对比更容易看出门道。普通集合函数像快递站统一装车等所有包裹都放进仓库才出发管道化表函数像流水线传送带每封装好一件就送走一件外层 TABLE 查询可以立刻看到第一批结果。对于 split 这种天生逐行处理的逻辑PIPE ROW 正好卡在点子上。2. Codex 想看懂这段代码先给它配一条 TaoToken 通道我习惯把这类 Oracle 函数贴给 Codex 审一遍让它推演 PIPE ROW 循环中 j 和 i 的边界变化。Codex 是个命令行 AI 工具它能读 SQL、能解释执行过程但不会真的连到数据库去跑。要让 Codex 稳定响应我先在 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_end 注册并创建了 API Key然后修改 Codex 的配置文件让它走 TaoToken 提供的统一接入通道。Codex 的配置文件在 ~/.codex/config.toml没有就新建。我用的配置如下model_provider taotoken model YOUR_MODEL_ID [model_providers.taotoken] name TaoToken base_url https://taotoken.net/api env_key TAOTOKEN_API_KEY这里有两个容易踩的细节。Base URL 要填 https://taotoken.net/api末尾不要加 /v1不要拼路径到 /api/ 以外的位置。模型 ID 不要凭记忆编造以 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_end 模型广场当时的列表为准把选中的模型 ID 填到 model 字段。之后在终端执行 export TAOTOKEN_API_KEYYOUR_API_KEYKey 从 TaoToken 控制台创建。配置完成后我把 fn_split 的定义和调用方式分成三段贴给 Codex先贴 CREATE TYPE ty_str_split再贴 CREATE FUNCTION fn_split最后贴 SELECT * FROM TABLE(fn_split(1;;12;;123;;1234;;12345, ;;))。让它解释每一轮循环中 j 和 i 的关系以及 PIPE ROW 吐出的 COLUMN_VALUE 顺序。Codex 的推演结果是否正确我最终是在自己电脑的 SQL*Plus 里验证的它负责帮我看代码我负责执行 SQL。3. 把 fn_split 跑起来用 TABLE 验证 COLUMN_VALUE 的顺序完整可运行的脚本如下类型和函数都在本地数据库执行CREATE OR REPLACE TYPE ty_str_split IS TABLE OF VARCHAR2 (4000); / CREATE OR REPLACE FUNCTION fn_split ( p_str IN VARCHAR2, p_delimiter IN VARCHAR2 ) RETURN ty_str_split PIPELINED IS j INT : 0; i INT : 1; len INT : 0; len1 INT : 0; str VARCHAR2 (4000); BEGIN len : LENGTH (p_str); len1 : LENGTH (p_delimiter); WHILE j len LOOP j : INSTR (p_str, p_delimiter, i); IF j 0 THEN j : len; str : SUBSTR (p_str, i); PIPE ROW (str); IF i len THEN EXIT; END IF; ELSE str : SUBSTR (p_str, i, j - i); i : j len1; PIPE ROW (str); END IF; END LOOP; RETURN; END fn_split; /然后把查询语句放进 SQL*Plus 或 PL/SQL Developer 里执行SELECT * FROM TABLE (fn_split (1;;12;;123;;1234;;12345, ;;));执行后应当返回五行 COLUMN_VALUE顺序依次是 1、12、123、1234、12345。这个验证动作必须由你在本地数据库完成Codex 只负责解释和对照。我把查询结果贴回对话让 Codex 根据五行输出反推循环过程确认逻辑没有漏掉最后一段。值得留意的是如果输入字符串以分隔符结尾比如 1;;12;;原版 fn_split 可能会在 WHILE 循环里多吐一个空字符串行。这不是代码格式问题而是函数对尾部空串的处理方式。把这种边界情况交给 Codex 分析时它往往会建议在循环里增加一个判断或者在 PIPE ROW 之前过滤掉空串具体怎么改还是要回到 SQL 里实测。4. mytype/mytypelist管道化表函数不止能拆字符串fn_split 展示的是最基础的字符串拆分管道化表函数同样可以返回对象集合。原文还给出一个 pipelineme 的例子每行吐出一个对象字段包括编号和描述。这种写法适合把格式化的业务数据从 PL/SQL 层直接暴露给 SQL 查询。创建对象类型和对象表类型的语句如下CREATE TYPE mytype AS OBJECT ( field1 NUMBER, field2 VARCHAR2 (50) ); / CREATE TYPE mytypelist AS TABLE OF mytype; / CREATE OR REPLACE FUNCTION pipelineme RETURN mytypelist PIPELINED IS v_mytype mytype; BEGIN FOR v_count IN 1 .. 20 LOOP v_mytype : mytype (v_count, Row || v_count); PIPE ROW (v_mytype); END LOOP; RETURN; END pipelineme; /查询同样用 TABLE 操作符SELECT * FROM TABLE (pipelineme);这里能看到 PIPE ROW 的另一个特点每次吐出的是一整行对象而不是单个值。对 split 场景来说吐出去的是字符串对 pipelineme 来说吐出去的是 mytype 对象。管道化表函数把 PL/SQL 的游标循环和 SQL 的集合查询拆开PL/SQL 负责逐行构造数据SQL 负责按表的方式消费结果。字段长度为 VARCHAR2(50) 时Row || v_count 不会超长但当 v_count 增长到三位数时仍然安全。若字段要装更长的描述把 50 改成 200 或 4000 都行类型定义变了函数返回值也自然适配这就是管道化表函数比 REF CURSOR 灵活的地方。5. 排障split 少一行、末尾多空行、Codex 给的代码连不上库我在实际跑 fn_split 时遇到过三次问题每次都能在错误信息里看出端倪。第一次是查询返回四行少了最后一个分段。原因是 INSTR 最后一次找不到分隔符时返回 0原代码把 j 置成 len 后 PIPE ROW(str)但 if i len 的退出判断在部分 Oracle 版本中可能提前跳出。处理办法是去掉提前 EXIT让 WHILE 循环自然结束或者把退出条件改成 i len。第二次是字符串以分隔符结尾时多出一行空字符串。比如 fn_split(A;;B;;, ;;) 在最后一次循环里把空串也吐了出去。这时可以在 PIPE ROW(str) 前加一个条件IF TRIM(str) IS NOT NULL 再吐行空串直接跳过。第三次不是 fn_split 的问题而是 Codex 请求时报 404 invalid model。原因是我在配置里填了一个记忆中不存在的模型 ID。解决方法是回到 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_end 查看模型广场当前列表把实际模型 ID 填进 config.toml同时检查 base_url 是否多写了 /v1——多写 /v1 会让请求路径变成 /api/v1/chat/completions服务端自然找不到对应模型。正确地址是 https://taotoken.net/api末尾什么都不加。6. 验证完别急着关控制台对一下这一次调用记没记账fn_split 的代码在本地 SQL*Plus 里跑出五行输出后我回到 TaoToken 控制台看了一眼调用记录。提问时消耗的是模型 API 调用本地执行 SQL 不产生请求所以账单上只有几条 Codex 对话的条目这正好验证了“Codex 只读代码、不碰数据库”的工作方式。如果想用同一把 Key 先快速测试模型响应可以直接打开 TaoToken 模型对话 发一条消息验证 Key 有效性。长期写代码需求多的话可以在 Coding Plan 页面看套餐是否够用Key 的统一创建入口在 控制台 API Keys。我自己的习惯是先把 fn_split 这类函数在本地跑通再把完整代码和输出结果贴给 Codex让它逐行解释 PIPE ROW 的触发时机。如果 Codex 对边界条件的理解和本地输出不一致以本地数据库为准同时把差异反馈回去。经过这一轮踩坑fn_split 的 PIPE ROW 循环、TABLE 查询和 Codex 的通道配置算是一条龙跑通了下次再遇到管道化表函数的其他场景至少能快速定位是 SQL 边界问题还是通道配置问题。
RELATED

相关推荐

家庭电脑远程唤醒实战指南:WOL+公网IP配置全解析

家庭电脑远程唤醒实战指南:WOL+公网IP配置全解析

1. 这不是“远程控制”,而是让家里那台沉睡的电脑自己醒过来你有没有过这样的经历:人在外地,突然想起家里电脑上存着一份没备份的设计稿,或者一段还没导出的视频剪辑;想用手机连上去取个文件,却发现电脑根本…

📅 2026/9/16 22:55:10
前后端分离的大学生健康档案管理系统:SpringBoot+Vue+MySQL实践

前后端分离的大学生健康档案管理系统:SpringBoot+Vue+MySQL实践

简介:这是一份基于SpringBoot、MySQL与Vue前后端分离架构的大学生健康档案管理系统源码包,面向计算机相关专业学生及毕业设计开发者,可直接作为毕设项目使用。项目整合Mybatis、Shiro、ElementUI等主流技术,涵盖管理员、普通用户、…

📅 2026/9/16 22:55:10
Python实现加密流量恶意行为检测:TLS握手+证书摘要+时序特征

Python实现加密流量恶意行为检测:TLS握手+证书摘要+时序特征

简介:本资源是面向计算机、信息安全、人工智能及大数据相关专业学生与从业者的加密恶意流量AI检测实战项目,聚焦于利用Python构建可落地的网络安全分析模型,解决当前HTTPS等加密流量中隐蔽恶意行为难以识别的痛点。压缩包共24个文件&#xff…

📅 2026/9/16 22:50:08
MORE NEWS

更多资讯

📰

SourceTree冲突解决全指南:从合并原理到外部工具实战

SourceTree这个系列写到第四篇,前几篇把安装、关联仓库、日常提交、拉取推送都过了一遍,今天必须来啃最硬的那块骨头:冲突解决。凡是使用Git超过一个礼拜的人,基本都会遇到那个熟悉的画面——高高兴兴点下合并,结果Sou…

📰

研一机器学习90天实操路径:从环境配置到CNN落地

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

NocoBase 发布管理实战指南:用版本控制、迁移管理与备份构建可回退的多环境发布链路

NocoBase 发布管理实战指南:用版本控制、迁移管理与备份构建可回退的多环境发布链路 【免费下载链接】nocobase NocoBase is an open-source AI no-code platform for building business systems fast. Instead of generating everything from scratch, AI works o…

📰

8款口碑AI写作辅助网站横向实测,本硕博论文避坑全攻略

前言:AI 写论文乱象频发,实测 8 款工具理清适配边界 每到毕业季,本科生、硕博生都会集中寻找 AI 论文辅助工具,市面各类写作软件层出不穷。然而,这些工具普遍存在几大硬伤:虚假参考文献、无法匹配本校格式、…

📰

不走官方通道,Codex 走 TaoToken 行不行?

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

CTFHub SSRF POST请求:gopher协议构造POST报文

CTFHub 技能树里的Web-SSRF POST请求这道题,我带过好几个刚入门的朋友做,几乎每个人第一次都会卡在同一个地方:前面几道 SSRF 关卡用?urlhttp://127.0.0.1/xxx打得顺手,一到这题把 URL 换成同样的形式,回显不是空白就…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬