ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

帆软报表调用ORACLE存储过程并返回参数:TaoToken统一Key配置与调试实录

帆软报表调用ORACLE存储过程并返回参数:TaoToken统一Key配置与调试实录 1. 帆软前台调用 ORACLE 存储过程并返回参数卡在哪一步帆软报表调用 ORACLE 存储过程并返回参数是很多做企业报表的同学绕不开的一关。它要解决的问题很具体报表前台点一个按钮触发数据库里的存储过程过程执行完还要把结果比如成功标志T、失败标志F回显到页面上。适合谁适合已经会用帆软设计器、但对 ORACLE 存储过程输出参数尤其是SYS_REFCURSOR游标类型和前台 JS 取值不太熟的开发者。真正卡人的地方通常有三个。第一ORACLE 存储过程的输出参数如果是SYS_REFCURSOR它不是一个普通字符串帆软前台不能直接拿到得先把游标打开、把里面的行取出来。第二帆软的数据连接里怎么定义这个调用参数占位符怎么写返回的是结果集还是单值很多人第一次配会懵。第三前台 JS 用FR.remoteEvaluate拿到返回值之后怎么判断成功失败、怎么弹提示。我试过把整条链路拆开跑先在数据库里建一张测试表和存储过程再在帆软里配数据连接最后用前台 JS 调用并校验返回参数。下面按这个顺序来每一步都给可复制的片段。另外如果你在调试过程中想用 AI 辅助工具帮你解释报错、生成 SQL 模板可以用 TaoToken 的统一 Key 把多个工具的配置收口后面第 2 节会讲 settings.json 骨架怎么搭。2. 前置准备测试表、存储过程与 TaoToken 统一 Key2.1 建测试表和存储过程为了让结果直观先建一张三个字符串字段的测试表 A再写一个带输出游标的存储过程。注意SYS_REFCURSOR是 ORACLE 自带的游标类型帆软前台要拿它的内容必须OPEN之后按结果集读。-- 测试表 create table A ( col1 varchar2(50), col2 varchar2(50), col3 varchar2(50) ); -- 带输出游标的存储过程 create or replace procedure P_INOUT_DEMO(value2 out SYS_REFCURSOR) is begin insert into A select 999,1,1 from dual; commit; OPEN value2 FOR SELECT T FROM dual; end P_INOUT_DEMO;这里value2是输出参数类型SYS_REFCURSOR。过程体里先插一条数据并提交然后打开游标游标里查出一个单值T。这个T就是前台要拿到的“发布版本成功”标志。2.2 用 TaoToken 统一 Key 管理 AI 辅助工具调试存储过程和写帆软 JS 时我经常让 AI 工具帮我解释报错、补全 SQL。工具一多Key 和地址散落各处很乱。TaoToken 提供统一 Key 和 API 通道把模型对话、编码辅助这些入口收口到一个地址上。官网入口是 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 基址是 https://taotoken.net/api 不加 UTM。下面是一个settings.json骨架把统一 Key 和 API 地址填进去多个 AI 辅助工具可以共用。注意把sk-你的Key换成你在控制台生成的真实 Key。{ ai: { provider: taotoken, api_base: https://taotoken.net/api, api_key: sk-你的Key, models: { chat: gpt-4o-mini, code: claude-3-5-sonnet }, timeout_ms: 60000 } }Key 在控制台的 API Keys 页面生成地址是 https://taotoken.net/console/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi_keysutm_campaignrewrite 。生成后建议按项目分 Key方便排查是哪个工具在调用。如果你主要做长期编码和 Agent 类任务可以看 Coding Plan https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding_planutm_campaignrewrite 。3. 可复制配置帆软数据连接与存储过程调用模板3.1 数据连接配置在帆软设计器里新建一个 JDBC 数据连接指向你的 ORACLE 库。连接串大致如下把主机、端口、服务名换成你自己的jdbc:oracle:thin://192.168.1.10:1521/ORCLPDB1驱动类用oracle.jdbc.OracleDriver用户名密码填有权限执行该存储过程的账号。配好后点“测试连接”能通再往下走。这一步不通后面全是白搭。3.2 存储过程调用模板帆软里调用存储过程常见写法是用SQL函数配合{call ...}语法。输出参数用?占位。下面这个模板对应上面的P_INOUT_DEMO{call P_INOUT_DEMO(?)}在帆软数据集里如果只想拿游标里的单值可以把它当成一个返回结果集的查询来用。配置时把“定义数据连接”换成你实际的数据连接名比如ORCL_TEST。参数个数和顺序要和存储过程签名一致P_INOUT_DEMO只有一个输出参数所以占位符就一个。3.3 前台 JS 调用并取返回参数前台按钮的事件里用FR.remoteEvaluate执行这段 SQL 并拿到返回值。可复制片段如下var sql SQL(ORCL_TEST,{call P_INOUT_DEMO (?)},1,1); var res FR.remoteEvaluate(sql); alert(res); if (T res) { alert(发布版本成功); } else { alert(发布版本失败请联系系统负责人); }SQL(数据连接名,语句,1,1)里的两个1分别控制取第几行第几列这里取第一行第一列正好是游标里查出的T。这样前台就能拿到存储过程返回的参数并做判断。4. 验证请求与成功结果4.1 数据库侧先验证在 SQL 客户端里直接跑一遍确认存储过程本身没问题var v_cur SYS_REFCURSOR; exec P_INOUT_DEMO(:v_cur); print v_cur;如果能看到T说明过程逻辑正确。再看表 A应该多了一条999,1,1的记录。数据库侧通了问题就只可能在帆软配置或前台 JS。4.2 帆软侧验证在数据集预览里执行{call P_INOUT_DEMO(?)}正常应该返回一行一列值为T。如果预览报错先看数据连接是否选对、账号是否有执行权限。预览通过后再挂到前台按钮上点一下看弹窗是不是“发布版本成功”。4.3 返回参数对照环节期望结果常见异常数据库执行游标返回 T表 A 新增一行权限不足、过程未编译帆软数据集预览一行一列值 T连接名写错、占位符数量不符前台 JS 调用弹窗“发布版本成功”返回值带空格、类型不匹配5. 本篇常见错排查5.1 返回参数拿不到或为空最常见的原因是游标没打开或者SQL函数取的行列位置不对。SYS_REFCURSOR必须OPEN ... FOR之后才有内容。另外SQL(...,1,1)里的行列索引从 1 开始写 0 会取不到。如果返回的是null检查存储过程里是否真的OPEN了游标。5.2 报“参数个数不匹配”{call P_INOUT_DEMO(?)}里的?数量必须和存储过程参数个数一致。如果过程有两个参数一个入参一个出参就要写两个?。入参可以直接在 SQL 里写死比如{call P_DEMO(X, ?)}。5.3 前台 JS 判断总是不相等FR.remoteEvaluate返回的可能是带空格或换行的字符串。稳妥做法是先trimvar res (FR.remoteEvaluate(sql) ).trim(); if (res T) { /* 成功 */ }用而不是避免隐式类型转换带来的意外。5.4 数据连接测试不通先确认 JDBC 驱动版本和 ORACLE 版本匹配再确认网络能到数据库端口。连接串里服务名和 SID 写法不同//host:port/service是服务名写法host:port:SID是 SID 写法别混。6. 继续调试与接入文档整条链路跑通后剩下的就是把它固化到你的报表模板里。如果你在写 SQL、解释报错、生成调用模板时需要 AI 辅助用 TaoToken 的统一 Key 把工具配置收口会更省心。模型对话入口在 https://taotoken.net/model-chat?utm_sourcetaotoken_aicg_blog_endutm_contentmodel_chatutm_campaignrewrite 接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite API Keys 管理在 https://taotoken.net/console/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi_keysutm_campaignrewrite 。长期做编码和 Agent 任务的话Coding Plan 在 https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding_planutm_campaignrewrite 。最后留一个实用技巧把存储过程的返回标志统一约定成单字符T/F前台只做一次trim和判断别在 JS 里堆复杂逻辑。数据库侧该commit的地方一定commit否则前台看到成功、数据却没落库这种坑最难查。
返回列表