【问题标题】:Get only Oracle function return table's columns and their types仅获取 Oracle 函数返回表的列及其类型
【发布时间】:2015-06-15 11:39:47
【问题描述】:

是否有一个 oracle 查询,我可以使用它来获取返回一个表的 oracle 函数的详细信息,我在其中查找该表的信息,例如记录名称,但主要是该记录中的列及其类型。

示例函数:

create or replace
function return_table return t_nested_table AS

v_ret   t_nested_table;

begin
  v_ret  := t_nested_table();

  v_ret.extend;
  v_ret(v_ret.count) := t_col(1, 'one');

  v_ret.extend;
  v_ret(v_ret.count) := t_col(2, 'two');

  v_ret.extend;
  v_ret(v_ret.count) := t_col(3, 'three');

  return v_ret;
end return_table;

使用类型

create or replace
type t_col as object (
  i number,
  n varchar2(30)
);
create or replace
type t_nested_table as table of t_col;

只知道所有者(系统)和对象名称(return_table),我想执行一个查询,它将为我返回 t_col 的信息。 列的名称(i,n)和类型(number,varchar2)

我不能只自己执行查询,因为在某些情况下,该函数可能需要输入,而当我试图仅获取列信息时,这些输入是未知的

我将在 C# .Net 中执行此查询

【问题讨论】:

标签: c# oracle


【解决方案1】:

对于当前登录,使用

SELECT uta.attr_name, uta.attr_type_name || CASE WHEN uta.length IS NOT NULL THEN '('||uta.length||')' ELSE NULL END 
  FROM user_coll_types uct
  JOIN user_type_attrs uta 
    ON uta.type_name = uct.elem_type_name
 WHERE uct.type_name = 'COLLECTION_NAME'
 ORDER BY uta.attr_no;

对于已登录的用户可以访问其他用户的类型:

SELECT ata.attr_name, ata.attr_type_name || CASE WHEN ata.length IS NOT NULL THEN '('||ata.length||')' ELSE NULL END 
  FROM all_coll_types act
  JOIN all_type_attrs ata 
    ON ata.type_name = act.elem_type_name AND ata.OWNER = act.OWNER
 WHERE act.type_name = 'COLLECTION_NAME'
   AND act.OWNER = 'OWNER_NAME'
 ORDER BY ata.attr_no;

对于数据库中存在的类型(需要具有特殊权限):

SELECT dta.attr_name, dta.attr_type_name || CASE WHEN dta.length IS NOT NULL THEN '('||dta.length||')' ELSE NULL END 
  FROM dba_coll_types dct
  JOIN dba_type_attrs dta 
    ON dta.type_name = dct.elem_type_name AND dta.OWNER = dct.OWNER
 WHERE dct.type_name = 'COLLECTION_NAME'
   AND dct.OWNER = 'OWNER_NAME'
 ORDER BY dta.attr_no;

【讨论】:

  • 起初我虽然没有集合名称,所以它不起作用,但我找到了一种使用对象名称获取集合名称的方法。感谢分配您的帮助
猜你喜欢
  • 2016-07-01
  • 2018-11-06
  • 2018-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-14
相关资源
最近更新 更多