首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Oracle8i说PLS-00382:表达式类型错误,但我看不到它

Oracle8i说PLS-00382:表达式类型错误,但我看不到它
EN

Stack Overflow用户
提问于 2012-04-18 16:13:27
回答 2查看 581关注 0票数 2

以下代码基于AskTom的流行线程Export to CSV

我在内部循环中修改了原始脚本,以处理嵌入的逗号和引号字符。

我无法在Oracle 8i上编译它。

我使用DBA Studio设置了utl_file_dir的值。然后,我使用SQL*Worksheet运行该脚本。报告的错误表明问题所在的位置是第46行。

代码语言:javascript
复制
    CREATE OR REPLACE PROCEDURE dump_table_to_csv
            ( p_tname IN VARCHAR2,
            p_dir   IN VARCHAR2,
            p_filename IN VARCHAR2 )
    IS

    l_output        utl_file.file_type;
    l_theCursor     INTEGER DEFAULT dbms_sql.open_cursor;
    l_columnValue   VARCHAR2(4000);
    l_status        INTEGER;
    l_query         VARCHAR2(1000) DEFAULT 'select * from ' || p_tname;
    l_colCnt        NUMBER := 0;
    l_separator     VARCHAR2(1);
    l_descTbl       dbms_sql.desc_tab;
    l_quote    VARCHAR2(1);

    BEGIN
            l_output := utl_file.fopen( p_dir, p_filename, 'w', 32760 );
            -- adjust date so the format is compatible with the target system
            -- in this case, PostgreSQL 9
            EXECUTE IMMEDIATE 'alter session set nls_date_format=''yyyy-mm-dd hh24:mi:ss'' ';
            -- the original version used the "rr" moniker for year.
            -- execute immediate 'alter session set nls_date_format=''rr-mm-dd hh24:mi:ss'' ';

            -- set up first row with column names
            dbms_sql.parse(  l_theCursor,  l_query, dbms_sql.native );
            dbms_sql.describe_columns( l_theCursor, l_colCnt, l_descTbl );

            FOR i IN 1 .. l_colCnt LOOP
                    utl_file.put( l_output, l_separator || '"' || l_descTbl(i).col_name || '"' );
                    dbms_sql.define_column( l_theCursor, i, l_columnValue, 4000 );
                    l_separator := ',';
            END LOOP;

            utl_file.new_line( l_output );
            l_status := dbms_sql.EXECUTE(l_theCursor);

            -- iterate through the data, for each row check each column
            WHILE ( dbms_sql.fetch_rows(l_theCursor) > 0 ) LOOP
                    l_separator := '';

                    FOR i IN 1 .. l_colCnt LOOP
                            dbms_sql.column_value( l_theCursor, i, l_columnValue );
                            --
                            -- if the separator or quote is embedded in the value then enclose in double-quotes
                            IF INSTR(l_columnValue, ',') != 0 OR INSTR(l_columnValue, '"') THEN
                                    l_quote := '"';
                                    -- double any/all embedded quotes
                                    l_columnValue := REPLACE(l_columnValue,'"','""');
                            ELSE
                                    l_quote := '';
                            END IF;
                            l_columnValue := l_separator || l_quote || l_columnValue || l_quote;
                            --
                            -- write the value to disk
                            utl_file.put( l_output, l_separator || l_columnValue );
                            l_separator := ',';
                    END LOOP;

                    utl_file.new_line( l_output );
            END LOOP;

            dbms_sql.close_cursor(l_theCursor);
            utl_file.fclose( l_output );

            EXECUTE IMMEDIATE 'alter session set nls_date_format=''dd-MON-yy'' ';

    EXCEPTION
            WHEN OTHERS THEN
                    EXECUTE IMMEDIATE 'alter session set nls_date_format=''dd-MON-yy'' ';
                    RAISE;
    END;
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-04-18 16:19:26

您在第46行缺少第二个instr()调用的!= 0

代码语言:javascript
复制
if instr(l_columnValue, ',') != 0 or instr(l_columnValue, '"') then

应该是:

代码语言:javascript
复制
if instr(l_columnValue, ',') != 0 or instr(l_columnValue, '"') != 0 then
票数 6
EN

Stack Overflow用户

发布于 2012-04-18 16:20:05

Oracle在哪一行上引发错误?

我突然想到的第一个错误是下面这行

代码语言:javascript
复制
IF INSTR(l_columnValue, ',') != 0 OR INSTR(l_columnValue, '"') THEN

INSTR返回一个数字。条件的第一部分将INSTR的输出与一个数字进行比较。第二个不是--只有当INSTR返回一个布尔值时,它才有效。听起来像是你想

代码语言:javascript
复制
IF INSTR(l_columnValue, ',') != 0 OR INSTR(l_columnValue, '"') != 0 THEN
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10205442

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档