Oracle连接字符串空值

Oracle连接字符串空值,oracle,null,insert,Oracle,Null,Insert,我有以下程序: DECLARE r_template_row template_version_row%rowtype; r_tag_row tag%rowtype; string_insert varchar2(5000); v_rownumber number; BEGIN string_insert := 'insert into template_version(id, name, created_by, created, deleted, re

我有以下程序:

DECLARE
    r_template_row template_version_row%rowtype;
    r_tag_row  tag%rowtype;
    string_insert varchar2(5000);
    v_rownumber number;
BEGIN
    string_insert := 'insert into template_version(id, name, created_by, created, deleted, rew, filename) values (2, ''new_template'', 1, SYSDATE, ''N'', 1, ''new_template.xls'')';
    DBMS_OUTPUT.PUT_LINE(string_insert);

    for r_template_row in (select * from template_version_row)
    loop
        v_rownumber := ID_Generator.nextval;
        string_insert := 'insert into template_version_row(id, template_version_id, row_number, name, view_type_id, product_id, created_by, created, deleted, rev, sheet_leg_type) values ('||v_rownumber ||', 2, '|| r_template_row.ROW_NUMBER ||', '||r_template_row.NAME ||', '|| r_template_row.VIEW_TYPE_ID ||', '|| r_template_row.PRODUCT_ID ||', 1, Sysdate,''N'', 1, '||r_template_row.SHEET_LEG_TYPE_ID ||')';
        DBMS_OUTPUT.PUT_LINE(string_insert);
        for r_tag_row in (select * from tag where TEMPLATE_VERSION_ROW_ID = r_template_row.ID)
        loop
            string_insert := 'insert into tag(id, template_version_row_id, name, tag, tag_value_position_id, data_format, tag_type_id, segment, ipt_table_id, column_name, tag_order, separator, parameter_tag, leg_type_id, segment_template_vers_row_id, created_by, created, deleted, rev, is_mandatory, is_value_mandatory, is_returned_by_get_quote) values (ID_Generator.nextval,'|| v_rownumber ||', '||
                   r_tag_row.NAME ||', '
                || r_tag_row.TAG ||', '
                || r_tag_row.DATA_FORMAT ||', '
                || r_tag_row.TAG_TYPE_ID ||','
                || r_tag_row.SEGMENT||', '
                || r_tag_row.IPT_TABLE_ID ||', '
                || r_tag_row.COLUMN_NAME ||', '
                || r_tag_row.TAG_ORDER||', '
                || r_tag_row.SEPARATOR ||', '
                || r_tag_row.PARAMETER_TAG ||', '
                || r_tag_row.LEG_TYPE_ID || ','
                || r_tag_row.LEG_TYPE_ID||', '
                || r_tag_row.SEGMENT_TEMPLATE_VERS_ROW_ID
                || ', 1 , Sysdate, ''N'', 1, '
                || r_tag_row.IS_MANDATORY || ', '
                || r_tag_row.IS_VALUE_MANDATORY||', '
                || r_tag_row.IS_RETURNED_BY_GET_QUOTE||' )';
            DBMS_OUTPUT.PUT_LINE(string_insert);
        end loop;
    end loop;
END;
/

如果cursor.value为空,我需要插入空值。有人知道如何解决这个问题吗。在当前代码中,若游标为空,则空字符串将在结果中串联。谢谢你的帮助。PS:我尝试了colaesce函数,它抱怨我使用了varchar列。

我想我明白你的意思了,你正在创建动态查询,如果一些
游标.value
为空,那么它只是不放任何值,它在values子句中变为
(,
,)
。您可以在执行之前替换它们,如下所示:

string_insert := replace(
                    replace(
                        replace(string_insert ,
                                ',,',
                                ',null,'),
                        '(,',
                        '(null,'),
                    ',)',
                    ',null)');

干杯

您可以使用
合并
。对于非字符串的列,请使用
TO_CHAR
将它们显式转换为字符串,因此
COALESCE
只能处理字符串

string_insert := 'insert into tag(id, template_version_row_id, name, tag, tag_value_position_id, data_format, tag_type_id, segment, ipt_table_id, column_name, tag_order, separator, parameter_tag, leg_type_id, segment_template_vers_row_id, created_by, created, deleted, rev, is_mandatory, is_value_mandatory, is_returned_by_get_quote) values (ID_Generator.nextval,'|| v_rownumber ||', '||
     COALESCE(r_tag_row.name, 'NULL') || ', ' ||
     COALESCE(r_tag_row.tag, 'NULL') || ', ' ||
     COALESCE(r_tag_row.data_format, 'NULL') || ', ' ||
     COALESCE(r_tag_row.tag_type_id, 'NULL') || ', ' ||
     COALESCE(r_tag_row.segment, 'NULL') || ', ' ||
     COALESCE(TO_CHAR(r_tag_row.ipt_table_id), 'NULL') || ', ' ||
     COALESCE(r_tag_row.column_name, 'NULL') || ', ' ||
     COALESCE(TO_CHAR(r_tag_row.tag_order), 'NULL') || ', ' ||
     COALESCE(r_tag_row.separator, 'NULL') || ', ' ||
     COALESCE(r_tag_row.parameter_tag, 'NULL') || ', ' ||
     COALESCE(TO_CHAR(r_tag_row.leg_type_id), 'NULL') || ', ' ||
     COALESCE(TO_CHAR(r_tag_row.segment_template_vers_row_id), 'NULL') || ', ' ||
     '1 , sysdate, ''n'', 1, ' ||
     COALESCE(r_tag_row.is_mandatory, 'NULL') || ', ' ||
     COALESCE(r_tag_row.is_value_mandatory, 'NULL') || ', ' ||
     COALESCE(r_tag_row.is_returned_by_get_quote, 'NULL') || ' )';

“cursor.value为空”是什么意思?您的意思是当
select*from标记,其中TEMPLATE\u VERSION\u ROW\u ID=r\u TEMPLATE\u ROW.ID
不返回行吗?或者您的意思是像
r\u tag\u row.DATA\u FORMAT
这样的单列为空,您希望连接结果变为空?或者别的什么?我的意思是单列为空,这意味着它返回空值。如果列为空,我需要在insert中添加、、null“字符串。这也是解决方案,但我更喜欢类似isNull | | null | | |的内容,这在合并或解码的情况下是不可能的,或者在所有条件下都需要将表达式作为相同类型的reuslt的情况下是不可能的。