暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 将表选择性行转储到csv

askTom 2018-03-12
523

问题描述

问候

我正在尝试在下面的脚本查询 (“select * fen' | | p_tname ;) 中包含搜索条件,以仅获取过去24小时内雇用的行/员工。

我在下面试过了 --

SQL> 创建或替换过程dump_table_to_csv (varchar2中的p_tname,varchar2中的p_filename)
authid current_user /* <<== 如果你想...以 “invoker” 身份运行,并以角色运行 */

输出utl_file.file_type;
l_theCursor整数默认dbms_sql.open_cursor;
l_columnValue varchar2(4000);
2 3 4 5 6 7 l_status整数;
l_sysmodtime日期;
l_query varchar2(1000)
default 'select * from ' || p_tname ||' where hiredate >= '||to_char(sysdate-1,'dd-mm-yyyy hh24:mi:ss');
l_colCnt数: = 0;
L_ 分离器varchar2(1);
L _ desctbl dbms_sql.desc_tab;
开始
输出: = utl_file.fopen ('xxd_utl',p_filename,'w' );
立即执行
8 9 10 11 12 13 14 15 16 17 '更改会话集nls_date_format =' dd-mon-yyyy hh24:mi:ss '';
dbms_sql.parse( l_theCursor,l_query,dbms_sql.native );
dbms_sql.describe_columns (l_thursor,l_colCnt,l_descTbl );
我在1 ..l_colCnt循环
utl_file.put( l_output,
l_separator | | '"' | | l_descTbl(i).col_name | | '"' );
dbms_sql.define_column (l_thursor,i,l_columnValue,4000 );
18 19 20 21 22 23 24 l _ 分隔符: = ',';
结束循环;
utl_file.new_line( l_output );
l_status := dbms_sql.execute(l_theCursor);
而 (dbms_sql.fetch_rows(l_theCursor)> 0) 循环
L _ 分隔符: = '';
我在1 ..l_colCnt循环
dbms_sql.column_value (l_thursor,i,l_columnValue );
utl_file.put( l_output, l_separator || l_columnValue );
L _ 分隔符: = ',';
结束循环;
utl_file.new_line( l_output );
25 结束循环;
dbms_sql.close_cursor(l_theC 26 ursor);
27 28 29 30 31 32 33 34 35 36 37 38 utl_file.fclose( l_output );
立即执行 'alter session set nls_date_format=''dd-MON-yy'' ';
异常
当其他人那么
立即执行 'alter session set nls_date_format=''dd-MON-yy'' ';
39 40 41 42 43 ra是e;
44结束;
45/

程序创建。

SQL> exec dump_table_to_csv('scott.emp','scott.csv ');
开始dump_table_to_csv('scott.emp','scott.csv '); 结束;

*
第1行的错误:
ORA-00933: SQL命令未正确结束
ORA-06512: 在 “斯科特.DUMP_TABLE_TO_CSV”,第43行
ORA-06512: 在第1行


SQL>

感谢您的期待

问候,
艾哈迈德

专家解答

一些快速调试显示了问题

SQL> set serverout on
SQL> declare
  2   p_tname varchar2(10) := 'EMP';
  3   l_query varchar2(1000) default 'select * from ' || p_tname ||' where hiredate >= '||to_char(sysdate-1,'dd-mm-yyyy hh24:mi:ss');
  4  begin
  5    dbms_output.put_line(l_query);
  6  end;
  7  /
select * from EMP where hiredate >= 12-03-2018 10:48:35

PL/SQL procedure successfully completed.

SQL> select * from EMP where hiredate >= 12-03-2018 10:48:35;
SP2-0552: Bind variable "48" not declared.


您没有构建有效的查询。

SQL> set serverout on
SQL> declare
  2   p_tname varchar2(10) := 'EMP';
  3   l_query varchar2(1000)
  4     default 'select * from ' || p_tname ||' where hiredate >= to_date('''||to_char(sysdate-1,'dd-mm-yyyy hh24:mi:ss')||''',''dd-mm-yyyy hh24:mi:ss'')';
  5  begin
  6    dbms_output.put_line(l_query);
  7  end;
  8  /
select * from EMP where hiredate >= to_date('12-03-2018 10:50:01','dd-mm-yyyy hh24:mi:ss')



但是我强调...在这个网站上搜索 “SQL注入”。让人们传入SQL查询的部分时要非常小心。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论