Oracle Cast使用%TYPE属性

时间:2012-10-18 09:42:29

标签: oracle oracle11g

我想在我的SQL语句中使用%TYPE属性转换值。 %TYPE属性允许您在自己的声明中使用字段,记录,嵌套表,数据库列或变量的数据类型,而不是对类型名称进行硬编码。

这有效:

insert into t1  select cast(v as varchar2(1)) from t2;

但我想

insert into t1  select cast(v as t1.v%TYPE) from t2;

Error starting at line 16 in command:
insert into t1  select cast(v as t1.v%TYPE) from t2
Error at Command Line:16 Column:37
Error report:
SQL Error: ORA-00911: Ongeldig teken.
00911. 00000 -  "invalid character"
*Cause:    identifiers may not start with any ASCII character other than
           letters and numbers.  $#_ are also allowed after the first
           character.  Identifiers enclosed by doublequotes may contain
           any character other than a doublequote.  Alternative quotes
           (q'#...#') cannot use spaces, tabs, or carriage returns as
           delimiters.  For all other contexts, consult the SQL Language
           Reference Manual.
*Action:

这可以(或类似的东西)完成吗?

编辑: 我想要实现的是:当t2.v很大时我想截断它。我试图避免使用具有硬编码字段长度的substr。所以强制转换(v为t1.v%TYPE)而不是substr(v,1,1)

1 个答案:

答案 0 :(得分:5)

%TYPE仅在PL / SQL中可用,并且只能在declaration section of a block中使用。所以,你不能做你正在尝试的事情。

您可能认为可以声明自己的PL / SQL(子)类型并在语句中使用它:

declare
    subtype my_type is t1.v%type;
begin
    insert into t1 select cast(v as my_type) from t2;
end;
/

...但这也行不通,因为cast()是一个SQL函数而不是PL / SQL函数,只识别内置和模式级集合类型;而且您也无法使用%TYPE创建SQL type


作为一个讨厌的黑客,你可以做类似的事情:

insert into t1 select substr(v, 1,
    select data_length
    from user_tab_columns
    where table_name = 'T1'
    and column_name = 'V') from t2;

如果您可以将该长度存储在变量中 - 例如SQL * Plus中的替换或绑定变量,或PL / SQL中的局部变量,那么这将更加可口。例如,如果它是通过SQL * Plus进行的直接SQL更新,则可以使用绑定变量:

var t1_v_len number;
begin
    select data_length into :t1_v_len
    from user_tab_columns
    where table_name = 'T1' and column_name = 'V';
end;
/
insert into t1 select substr(v, 1, :t1_v_len) from t2;

类似的东西可以在其他设置中完成,它取决于插件的执行位置。