一、问题描述
现有一张学生表(student),
需要编写一个函数实现下图的输出:
(1)暂时不考虑数据库表字段类型和java代码中字段类型的对应关系,一律用String(这个后续在函数中添加判断就行)
(2)能获取字段名,及字段注释
二、代码实现
create or replace type "T_RET_TABLE" as table of varchar2(1000);
create or replace function "FN_GENERATE_ENTITY"(vc_table_name in varchar2)
return t_ret_table pipelined is
v_sql varchar2(2000);
vc_field_name varchar2(200); --字段在实体类中的名称
result_cur sys_refcursor;--存放动态sql的执行结果
--功能:根据数据库的表字段生成对应的java实体类代码
/* 使用示例:
select * from table(FN_GENERATE_ENTITY('student'));
*/
begin
v_sql:='select ''private String '' ||' ||
'lower(regexp_substr(regexp_replace(initcap(ut.COLUMN_NAME), ''Vc_|D_'', ''''),''^.'')) ||' ||
'regexp_replace(regexp_replace(regexp_replace(initcap(ut.COLUMN_NAME), ''Vc_|D_'', ''''),''^(.)'',''''),''_'','''') || '';'' ||' ||
''' //'' || ucc.comments ' ||
'from user_tab_cols ut ' ||
'left join user_col_comments ucc ' ||
'on (ut.TABLE_NAME = ucc.table_name and ut.COLUMN_NAME = ucc.column_name) ' ||
'where ut.TABLE_NAME = upper('''|| vc_table_name ||''') order by ut.column_id';
open result_cur for v_sql;
fetch result_cur into vc_field_name;
loop
exit when not result_cur%found;
--dbms_output.put_line(vc_field_name);
pipe row(vc_field_name);
fetch result_cur into vc_field_name;
end loop;
close result_cur;
end;
至于整个的思考过程,可以看看我以前编写其他函数的思考过程(https://blog.csdn.net/u010999809/article/details/79940218),因为怎么得到的过程其实远比拿到一个结果更重要。最近比较忙,以后有时间把过程给补一下吧