通过plsql查询获取表名

Posted

技术标签:

【中文标题】通过plsql查询获取表名【英文标题】:Get Tables Name Through Plsql Query 【发布时间】:2015-11-19 11:04:26 【问题描述】:

我需要一个输入用户名和密码的过程,然后使用每个表的创建脚本来获取该架构中的现有表?

这是我尝试过的,但是错了:

CREATE OR REPLACE procedure TABLE_INFO(P_USER_NAME IN VARCHAR2,P_PASSWORD IN VARCHAR,P_TABLE_NAME OUT VARCHAR2,P_SCRIPT OUT VARCHAR2) 
IS 
  chk_username all_users.username%type; 
  CURSOR C IS SELECT table_name FROM USER_TABLES; 
  t_tablename user_tables.table_name%type; 
BEGIN 
  SELECT username into chk_username from all_users 
  where chk_username=p_user_name; 
  open c; 
  loop 
    fetch c into t_tablename; 
    exit when c% notfound; 
    end loop; 
exception when no_data_found then 
  dbms_output.put_line('Wrong Username Or Password'); 
  close c; 
end; 
/

【问题讨论】:

你应该至少提供你已经尝试过的代码和你得到的错误 这是我的代码,完全错误 CREATE OR REPLACE procedure TABLE_INFO(P_USER_NAME IN VARCHAR2,P_PASSWORD IN VARCHAR,P_TABLE_NAME OUT VARCHAR2,P_SCRIPT OUT VARCHAR2) IS chk_username all_users.username%type;光标 C 是从 USER_TABLES 中选择表名; t_tablename user_tables.table_name%type; BEGIN SELECT username into chk_username from all_users where chk_username=p_user_name;打开 c;循环获取 c 到 t_tablename;当 c% not found 时退出;结束循环;当 no_data_found 然后 dbms_output.put_line('Wrong Username or Password');关闭 c;结尾; / 请查看我如何编辑您的帖子并尝试自己进一步编辑以提出一个好问题。同时提供您遇到的错误信息 【参考方案1】:
    Try this code. Let me know if this helps.

    CREATE OR REPLACE PROCEDURE TABLE_INFO(
        P_USER_NAME IN VARCHAR2,
        --    P_PASSWORD  IN VARCHAR, --Not required
        P_TABLE_NAME OUT sys_refcursor)
      --    P_SCRIPT OUT VARCHAR2) --Not required
    AS
    BEGIN

    -----------------------For DDL script use dbms_metadata.get_ddl-------------------------
      OPEN P_TABLE_NAME FOR 
      SELECT OWNER,TABLE_NAME,dbms_metadata.get_ddl('TABLE',TABLE_NAME) "table DDL" 
      FROM all_tables WHERE upper(OWNER) = upper(P_USER_NAME);

    END;

--------------------To EXECUTE this proc---------------------------------
var usr VARCHAR2(100);
VAR p_lst refcursor;
exec TABLE_INFO(<username>,:p_lst);
------------------------------------------------------------------------

【讨论】:

这里是结果:精确提取返回超过请求的行数 ORA-06512:在第 7 行 01422。00000 -“精确提取返回超过请求的行数” *原因:指定的数量in exact fetch 小于返回的行。 *操作:重写查询或更改请求的行数 过程 TABLE_INFO 已编译 如果我们可以将其构建为匿名块或函数也将被接受。 伙计,这对我来说很好用。你不可能得到 EXACT Fetch 错误,因为我们在这里选择任何 INTO 子句。 是的,它工作正常 :) 但我所说的要求在哪里? 匿名块或函数你的要求是什么?【参考方案2】:
Check this out. This is a function returning all the values as per requirement.

--  Obj Creation
CREATE OR REPLACE TYPE my_obj
IS
  OBJECT
  (
    TAB_NAME VARCHAR2(100),
    DDL_S    VARCHAR2(32676) );

-- Table type Creation

CREATE OR REPLACE TYPE my_tab
IS
  TABLE OF my_obj;

--Function Creation---

CREATE OR REPLACE FUNCTION TABLE_INFO_FUN(
  P_USER_NAME IN VARCHAR2 )
RETURN my_tab
AS
  my_otpt my_tab;
BEGIN
  -----------------------For DDL script use dbms_metadata.get_ddl-------------------------
  SELECT CAST( multiset
    (SELECT my_obj(TABLE_NAME,dbms_metadata.get_ddl('TABLE',TABLE_NAME))
    FROM all_tables
    WHERE upper(OWNER) = upper(P_USER_NAME)
    ) AS my_tab )
  INTO my_otpt
  FROM DUAL;
  RETURN my_otpt;
END;

-- Using Function to Select Data -------------
SELECT * FROM TABLE(TABLE_INFO_FUN(<USERNAME>));

【讨论】:

我的朋友非常感谢你的努力,请注意我只是一个初学者和刚毕业的人。并且我认为您给它的要求超过了它的大小,该任务的要求是创建过程或函数或匿名块,它们采用用户名和密码(模式用户名和密码)来获取其表。请接受我的问候,请帮助我 我可以知道传递密码的必要性。因为完全不建议通过网络传递“免费”的未加密密码。

以上是关于通过plsql查询获取表名的主要内容,如果未能解决你的问题,请参考以下文章

PLSQL Developer连接的是远程的数据库,查询时怎么设置表名前面不加数据库名

通过 SQL 查询获取特定数据库的所有表名?

JDBC:获取 SQL 查询中涉及的表名

金蝶通过字段名获取表名

如何查询一个ACCESS数据库中的表名和字段?

sql中的变量定义