以下面的查询为例:
select p.product_id, p.product_name,
product_type as product_type,
from products
group by p.product_id, p.product_name
union
select p.product_id, p.product_name,
cast(collect(coalesce(product_type, decode(product_description,null,'DESCR' || '-' product_description) as my_type) as product_type,
from products
group by p.product_id, p.product_name
第一个查询中的select语句将product_type作为varchar返回,而第二个查询product_type的类型为my_type。 这导致ORA-01790:表达式必须与相应的表达式具有相同的数据类型,因为数据类型不同。
是否可以将第一个查询的product_type转换为my_type类型?
我尝试更改第一个查询,如下所示,但没有运气。
select p.product_id, p.product_name,
cast(product_type as my_type) as product_type,
decode(product_source_location, null, 'NO_SOURCE', product_source_location)
from products
group by p.product_id, p.product_name
my_type定义为'TYPE "my_type" AS TABLE OF varchar2(4000)'
答案 0 :(得分:1)
我认为你不能在SQL中进行这样的转换。但是在PL / SQL中你可以:
CREATE OR REPLACE TYPE STRARRAY AS TABLE OF VARCHAR2 (255)
/
DECLARE
tab STRARRAY;
cnt NUMBER:= 0;
BEGIN
SELECT COUNT(*)
INTO cnt
FROM TABLE(CAST(tab AS strarray));
dbms_output.put_line(cnt);
END;
/
我认为上面的假设我错了。我没有删除它,因为它仍然是有效的例子。下面的示例使用COLLECT作为table_type的类型:
来转换现有的表列(emp表)CREATE OR REPLACE TYPE varchar2_ntt AS TABLE OF VARCHAR2(4000);
/
SELECT deptno
, CAST(COLLECT(ename) AS varchar2_ntt) AS emps
FROM scott.emp
GROUP BY deptno
/
-- This is dumb but works:
SELECT deptno
, CAST(COLLECT(ename) AS varchar2_ntt) AS emps
FROM scott.emp
GROUP BY deptno
UNION ALL
SELECT deptno
, CAST(COLLECT(ename) AS varchar2_ntt) AS emps
FROM scott.emp
GROUP BY deptno
/