• 全部
  • Oracle 基础和管理
  • Oracle 高级技术
  • Oracle 认证与考试
  • 职位交流
  • 问答

oracle 动态sql

凡迪 2014-09-02 08:10:20
本人要用动态sql完成oracle数据库的封装。
比如封装一个select函数,
int select(*mysql,int filednum,...) //参数为变参,fieldnum 为mysql语句中实际需要传出的参数个数

这样就会有几个问题:
第一:是否是采用select xxx into xxx 的形式来完成?这样的问题就是变量是不固定的,如何写动态sql
第二:select 语句中的字段类型也是不固定的,是否有影响?

忘各位大神给点意见,谢谢。
...全文
449 点赞 收藏 15
写回复
15 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
凡迪 2014-09-18
问题基本解决,用proc编程实现,可以满足未知参数输出(参数个数和参数类型),谢谢各位的回复。
回复
凡迪 2014-09-03
引用 3 楼 zlloct 的回复:
[quote=引用 2 楼 yzg001212 的回复:] informix 的动态sql是可以解决这样的问题,因为informix是直接先运行select语句,然后将得到的结果集按字段截取,这样就可以实现上述函数。 但是oracle在运行动态sql的时候select出的值必须先制定存储在变量中,所以麻烦的就在这里。 不知道有没有什么方法解决,本人oracle动态sql还不是很熟练,正在学习中,望各位大神能指导一下。
写个包,可以通过函数同名重载来根据参数类型和个数的不同调用具体的函数返回不同类型的值[/quote] 我想实现这个函数的目的是要完成linux c 下对oracle数据库操作的二次封装,这样方便后续开发。 int select(*mysql,int filednum,...) ; 这就是函数实现方式。 调用该函数的时候只需要传入具体的sql语句和参数,就能返回该sql语句查询得到的值。所以针对不同的sql语句,参数个数不一致,参数类型也不一致。
回复
bw555 2014-09-03
放到应用中实现应该会简单点,不一定要用oracle存储过程实现 如.NET可以直接运行select语句,将执行结果存入到datatable对象中,然后就可以取出每个字段的值
回复
CT_LXL 2014-09-03
引用 2 楼 yzg001212 的回复:
informix 的动态sql是可以解决这样的问题,因为informix是直接先运行select语句,然后将得到的结果集按字段截取,这样就可以实现上述函数。 但是oracle在运行动态sql的时候select出的值必须先制定存储在变量中,所以麻烦的就在这里。 不知道有没有什么方法解决,本人oracle动态sql还不是很熟练,正在学习中,望各位大神能指导一下。
写个包,可以通过函数同名重载来根据参数类型和个数的不同调用具体的函数返回不同类型的值
回复
凡迪 2014-09-03
informix 的动态sql是可以解决这样的问题,因为informix是直接先运行select语句,然后将得到的结果集按字段截取,这样就可以实现上述函数。 但是oracle在运行动态sql的时候select出的值必须先制定存储在变量中,所以麻烦的就在这里。 不知道有没有什么方法解决,本人oracle动态sql还不是很熟练,正在学习中,望各位大神能指导一下。
回复
CT_LXL 2014-09-03
引用 11 楼 yzg001212 的回复:
[quote=引用 10 楼 zlloct 的回复:] [quote=引用 5 楼 yzg001212 的回复:] [quote=引用 3 楼 zlloct 的回复:] [quote=引用 2 楼 yzg001212 的回复:] 能详细点介绍一下这个方法么,谢谢
不知道能不能满足你的要求: 如下: function:

create or replace function sql_test (sql_str varchar2) return SYS_REFCURSOR is
  po_return sys_refcursor;
begin
  open po_return for sql_str;
  return(po_return);
end ;
测试:

declare
 cur1 SYS_REFCURSOR;
 v_dual varchar2(40);
 i number;
 begin
   v_dual:='select 1 id from dual';
cur1:=sql_test(v_dual);
 fetch cur1 into i;
 dbms_output.put_line('----------------i :'||i);
 close cur1;

 end;
 
回复
凡迪 2014-09-03
引用 10 楼 zlloct 的回复:
[quote=引用 5 楼 yzg001212 的回复:] [quote=引用 3 楼 zlloct 的回复:] [quote=引用 2 楼 yzg001212 的回复:] informix 的动态sql是可以解决这样的问题,因为informix是直接先运行select语句,然后将得到的结果集按字段截取,这样就可以实现上述函数。 但是oracle在运行动态sql的时候select出的值必须先制定存储在变量中,所以麻烦的就在这里。 不知道有没有什么方法解决,本人oracle动态sql还不是很熟练,正在学习中,望各位大神能指导一下。
写个包,可以通过函数同名重载来根据参数类型和个数的不同调用具体的函数返回不同类型的值[/quote] 我想实现这个函数的目的是要完成linux c 下对oracle数据库操作的二次封装,这样方便后续开发。 int select(*mysql,int filednum,...) ; 这就是函数实现方式。 调用该函数的时候只需要传入具体的sql语句和参数,就能返回该sql语句查询得到的值。所以针对不同的sql语句,参数个数不一致,参数类型也不一致。 [/quote] 要不你就设计成1个参数吧,SQL语句(传入参数)。 返回类型为一个动态游标,这样就不会受参数个数和类型的限制了[/quote] 能详细点介绍一下这个方法么,谢谢
回复
CT_LXL 2014-09-03
引用 5 楼 yzg001212 的回复:
[quote=引用 3 楼 zlloct 的回复:] [quote=引用 2 楼 yzg001212 的回复:] informix 的动态sql是可以解决这样的问题,因为informix是直接先运行select语句,然后将得到的结果集按字段截取,这样就可以实现上述函数。 但是oracle在运行动态sql的时候select出的值必须先制定存储在变量中,所以麻烦的就在这里。 不知道有没有什么方法解决,本人oracle动态sql还不是很熟练,正在学习中,望各位大神能指导一下。
写个包,可以通过函数同名重载来根据参数类型和个数的不同调用具体的函数返回不同类型的值[/quote] 我想实现这个函数的目的是要完成linux c 下对oracle数据库操作的二次封装,这样方便后续开发。 int select(*mysql,int filednum,...) ; 这就是函数实现方式。 调用该函数的时候只需要传入具体的sql语句和参数,就能返回该sql语句查询得到的值。所以针对不同的sql语句,参数个数不一致,参数类型也不一致。 [/quote] 要不你就设计成1个参数吧,SQL语句(传入参数)。 返回类型为一个动态游标,这样就不会受参数个数和类型的限制了
回复
凡迪 2014-09-03
引用 8 楼 u010184335 的回复:
你这是什么语言
linux 下的c 开发
回复
你这是什么语言
回复
凡迪 2014-09-03
顶!顶!顶!顶!顶!顶!顶!
回复
凡迪 2014-09-03
定一下,各位大神有知道怎么弄的吗
回复
bw555 2014-09-02
啥都不是固定的,这函数要咋写 至少参数的个数、各个参数的类型、函数的返回值类型固定,才有可能写出来的
回复 1
发帖
Oracle
创建于2007-09-28

1.6w+

社区成员

Oracle开发相关技术讨论
申请成为版主
帖子事件
创建了帖子
2014-09-02 08:10
社区公告
暂无公告