Sql ORA-01790数据类型:如何添加在名称中使用文本而不仅仅是数字的功能

Sql ORA-01790数据类型:如何添加在名称中使用文本而不仅仅是数字的功能,sql,regex,oracle,plsql,sqldatatypes,Sql,Regex,Oracle,Plsql,Sqldatatypes,我还有下一个需要理解和修改的代码 更具体地说,下一个挑战是: 我需要提供不仅选择数字,而且选择某个面板名称的字符串的可能性 与此相反: select -1 as num from dual union all 我应该这样做在这种情况下,名称必须包含文本而不是数字 select 'some_text' as num from dual union all 进行此更改时,会出现如下错误: PL/SQL:ORA-01790:表达式必须具有与相应表达式相同的数据类型 表情 这是一个密码 请求\u脚本

我还有下一个需要理解和修改的代码

更具体地说,下一个挑战是: 我需要提供不仅选择数字,而且选择某个面板名称的字符串的可能性

与此相反:

select -1 as num from dual union all
我应该这样做在这种情况下,名称必须包含文本而不是数字

select 'some_text' as num from dual union all
进行此更改时,会出现如下错误:

PL/SQL:ORA-01790:表达式必须具有与相应表达式相同的数据类型 表情

这是一个密码

请求\u脚本:

declare
l_data              clob := request_pkg.get_request_data('panel_rza');

l_panel    constant varchar2(2000) := tpl_pkg.get_block(l_data, 'panel');
l_panels            clob;
l_count             integer := 0;
begin
    l_panels := '
    ';

for c in(
    select 9 as num from dual union all
    select -1 as num from dual union all
    select 2 as num from dual union all
    select 4 as num from dual union all
    select 19 as num from dual union all
    select 23 as num from dual union all
    select 18 as num from dual union all
    select 22 as num from dual union all
    select 8 as num from dual union all
    select -3 as num from dual union all
    select 20 as num from dual union all
    select -2 as num from dual union all
    select 24 as num from dual
) loop
    dbms_lob.append(l_panels, replace(l_panel, '{num}', c.num));

    select count(*)
      into l_count
      from dual
     where exists(
        select *
          from v_scheme_element_panel
         where upper(fk_table_name) = upper('panel_rza_' || c.num)
           and upper(type) = 'BLINKER'
           and upper(value) = 'ON'
        );

    if(l_count = 1) then
        tpl_pkg.set_block(l_panels, 'active', tpl_pkg.get_block(l_panel, 'active'));
        tpl_pkg.clear_block(l_panels, 'inactive');
    else
        select count(*)
          into l_count
          from dual
         where exists(
            select *
              from v_scheme_element_panel
             where upper(fk_table_name) = upper('panel_rza_' || c.num)
               and upper(type) = 'BLINKER'
               and upper(value) = 'CLOSED'
            );

        if(l_count = 1) then
            tpl_pkg.set_block(l_panels, 'inactive', tpl_pkg.get_block(l_panel, 'inactive'));
            tpl_pkg.clear_block(l_panels, 'active');
        else
            tpl_pkg.clear_block(l_panels, 'active');
            tpl_pkg.clear_block(l_panels, 'inactive');
        end if;
    end if;
end loop;

:result := '<dialog id="dialog_panel_rza"><title>Выбор Панелей РЗА</title><text><![CDATA[';
dbms_lob.append(:result, l_data);
tpl_pkg.set_block(:result, 'panel', l_panels);

dbms_lob.append(:result, ']]></text></dialog>');
end;
请求代码:

<table>
<!-- BEGIN panel -->
<tr>
<td>
<a href="javascript: request('panel_rza_{num}'); dialog_close('dialog_panel_rza');">Панель управления РЗА № {num}</a>
</td>
<td>
<td  align="right">
<!-- BEGIN active --><img height="24" src="./images/panel/panel_rza_alarm.png"><!-- END active -->
<!-- BEGIN inactive --><img height="24" src="./images/panel/panel_rza_inactive.png"><!-- END inactive -->
</td>
</tr>
<!-- END panel -->
</table>
TPL_包装:

function get_block(
    p_text                      clob,
    p_block_name                varchar2
) return clob
is
    l_block_text                clob;
begin
    l_block_text := regexp_substr(p_text, '<!-- BEGIN '||p_block_name||' -->.*<!-- END '||p_block_name||' -->',1,1,'inm');
    l_block_text := replace(l_block_text, '<!-- BEGIN '||p_block_name||' -->');
    l_block_text := replace(l_block_text, '<!-- END '||p_block_name||' -->');

    return l_block_text;
end;
谢谢

当您有不同的数据类型时,您应该使用to_char

select to_char(1) from dual
union all
select 'abc' from dual

如果要混合使用字符串和数字,必须将数字显式转换为字符串,即:

select to_char(9) as num from dual union all select to_char(-1) as num from dual union all select to_char(2) as num from dual union all select 'some_text' as num from dual union all
哇,真管用。正如你所说,我把所有的数字翻译成文本