gpt4 book ai didi

oracle - 将大型 sql 查询作为输入发送到 oracle 中的过程

转载 作者:行者123 更新时间:2023-12-02 00:08:26 26 4
gpt4 key购买 nike

我写了一个程序,它会自动从给定的查询中获取数据,并将 reuslt 数据集放入带有分隔符的目录中的文件中。它适用于像 select * from table_1 这样的小查询,但不适用于像这样的大查询:

SELECT
i.row_id,
translate(i.x_notes_txt, chr(10)||chr(13)||'|' , ' '),
null
FROM communication i,
contact c
WHERE i.last_upd >= (SELECT to_char(last_updated_dt, 'DD-MON-YYYY')
FROM extract_status
WHERE extract_nm = 'INTN300')
AND i.last_upd < sysdate
AND i.x_interaction_type_cd NOT IN ('XRAC','FMS','ATV','IRL')
AND i.pr_con_id = c.row_id
AND c.x_Prospect_Ind = 'Y';

在调用接受查询过程的过程时:- tab_to_flat('with_the_above_query') 它显示类似

的错误
1) PLS-00103: Encountered the symbol "|" .
2) Encountered the symbol "),
null
FROM communication i,

还有更多......任何人都可以帮助如何将这些查询作为输入传递吗????

        /* Formatted on 06/06/2013 1:42:56 PM (QP5 v5.163.1008.3004) */
CREATE OR REPLACE FUNCTION tab_to_flat (input_query IN CLOB,
dir_name IN VARCHAR2,
file_name IN VARCHAR2,
seperator IN VARCHAR2)
RETURN NUMBER
IS
c_seperator VARCHAR2 (3) := ' ';
incoming_seperator VARCHAR2 (3) := seperator;
no_of_rows NUMBER;
rec_tab DBMS_SQL.DESC_TAB;
col_cnt INTEGER;
src_id INTEGER DEFAULT DBMS_SQL.open_cursor;
val_varchar VARCHAR2 (32767);
val_num NUMBER;
val_date DATE;
file_input UTL_FILE.file_type;
l_start NUMBER;
row_cnt NUMBER := 0;
BEGIN
l_start := DBMS_UTILITY.get_time;

file_input :=
UTL_FILE.fopen (dir_name,
file_name,
'w',
32767);
DBMS_SQL.parse (src_id, input_query, 1);

DBMS_SQL.describe_columns (src_id, col_cnt, rec_tab);

FOR i IN 1 .. col_cnt
LOOP
CASE (rec_tab (i).col_type)
WHEN 1
THEN
DBMS_SQL.define_column (src_id,
i,
val_varchar,
32767);
WHEN 2
THEN
DBMS_SQL.define_column (src_id, i, val_num);
--when 8 then dbms_sql.define_column_long(src_id,i);
WHEN 12
THEN
DBMS_SQL.define_column (src_id, i, val_date);
ELSE
DBMS_SQL.define_column (src_id,
i,
val_varchar,
32767);
END CASE;
END LOOP;

no_of_rows := DBMS_SQL.execute (src_id);

LOOP
EXIT WHEN (DBMS_SQL.FETCH_ROWS (src_id) <= 0);
c_seperator := ' ';

FOR j IN 1 .. col_cnt
LOOP
CASE (rec_tab (j).col_type)
WHEN 1
THEN
DBMS_SQL.COLUMN_VALUE (src_id, j, val_varchar);
UTL_FILE.put (file_input, c_seperator || val_varchar);
WHEN 2
THEN
DBMS_SQL.COLUMN_VALUE (src_id, j, val_num);
UTL_FILE.put (file_input, c_seperator || val_num);
-- when 8 then dbms_sql.column_value_long(src_id,j,4000,1);

WHEN 12
THEN
DBMS_SQL.COLUMN_VALUE (src_id, j, val_date);
UTL_FILE.put (
file_input,
c_seperator || TO_CHAR (val_date, 'MM/DD/YYYY HH24:MI:SS'));
ELSE
DBMS_SQL.COLUMN_VALUE (src_id, j, val_varchar);
UTL_FILE.put (file_input, c_seperator || val_varchar);
END CASE;

c_seperator := incoming_seperator;
END LOOP;

UTL_FILE.new_line (file_input);
row_cnt := row_cnt + 1;
END LOOP;

DBMS_SQL.close_cursor (src_id);

DBMS_OUTPUT.put_line (
'The execution time is : ' || (DBMS_UTILITY.get_time - l_start));
RETURN row_cnt;
EXCEPTION
WHEN OTHERS
THEN
IF (SQLCODE = -942)
THEN
DBMS_OUTPUT.put_line ('Please check the table_name');
ELSE
RAISE;
END IF;
END;

最佳答案

看起来您只是没有转义查询字符串中包含的引号,所以您将其称为

tab_to_flat('SELECT i.row_id, translate(i.x_notes_txt, chr(10)||chr(13)||'|' , '   '),...')

您在 chr(13) 之后连接的 | 周围的单引号是直接问题,但还有其他问题。您可以仔细检查字符串中的每个引号并将其加倍:

tab_to_flat('SELECT i.row_id, translate(i.x_notes_txt, chr(10)||chr(13)||''|'' , ''   ''),...')

... 或更易读地使用 quoted value syntax :

tab_to_flat(q'[SELECT i.row_id, translate(i.x_notes_txt, chr(10)||chr(13)||'|' , '   '),...]')

... 其中 q'[ ... ]' 包含您的原始字符串并允许您使用单引号而无需转义它们。您只需确保实际查询不包含 [],或者如果包含则选择不同的分隔符。

这并没有说明您正在做的事情是否是一个好方法,以及您是否可以找到更好的方法来解决您的问题,也没有解决 SQL 注入(inject)等问题;这只是为了解决您当前调用的内容以及调用方式的问题。

关于oracle - 将大型 sql 查询作为输入发送到 oracle 中的过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16955610/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com