2015-11-19 5 views
-2

Мне нужна процедура, которая вводит имя_пользователя и пароль, а затем получает мне существующие таблицы в этой схеме с скриптом create для каждой таблицы?Получить таблицы Имя через запрос Plsql

Это то, что я пытался, но не так:

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; 
/
+0

Вы должны обеспечить по крайней мере свой код, который вы уже пробовали и ошибка ваш получать – davejal

+0

вот мой код, который совершенно неправильно CREATE OR REPLACE процедура table_info (P_USER_NAME В VARCHAR2, P_PASSWORD В VARCHAR, P_TABLE_NAME OUT VARCHAR2, P_SCRIPT OUT VARCHAR2) IS chk_username тип all_users.username%; CURSOR C IS SELECT имя_таблицы FROM USER_TABLES; t_tablename user_tables.table_name% type; BEGIN SELECT имя пользователя в chk_username от all_users, где chk_username = p_user_name; open c; loop fetch c в t_tablename; выход, когда c% notfound; контур конца; исключение когда no_data_found then dbms_output.put_line ('Неверное имя пользователя или пароль'); close c; конец; / –

+0

, пожалуйста, посмотрите, как я отредактировал ваше сообщение и попытаюсь отредактировать его самостоятельно, чтобы задать хороший вопрос. Также укажите сообщения об ошибках, с которыми вы столкнулись – davejal

ответ

0
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); 
------------------------------------------------------------------------ 
+0

. Вот результат: точная выборка возвращает больше запрошенного количества строк ORA-06512: в строке 7 01422. 00000 - «точная выборка возвращает более запрошенного количества строк» ​​ * Причина : Число, указанное в точной выборке, меньше возвращаемых строк. * Действие: перепишите запрос или измените количество запрошенных строк. Процедура TABLE_INFO скомпилирована –

+0

, если мы сможем ее создать как анонимный блок или функцию. –

+0

Бадди, это отлично работает для меня. Ни в коем случае вы не можете получить EXACT Fetch Error, так как здесь мы выбираем что-либо предложение INTO. –

0
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>)); 
+0

мой друг Я очень ценю ваши усилия, обратите внимание, что я просто начинающий и свежий выпускник. и требование, которое, я думаю, вы даете ему больше, чем его размер, Требование для этой задачи - создать процедуру или функцию или анонимный блок, который принимает имя пользователя и пароль (имя и пароль схемы) для получения своих таблиц. пожалуйста, примите мои приветствия и, пожалуйста, помогите мне –

+0

Могу ли я узнать, в чем необходимость прохождения passowrd. Поскольку передача «бесплатного» незашифрованного пароля по сети вовсе не рекомендуется. –

Смежные вопросы