我正在尝试在Oracle中创建一个简单的游标,它将循环遍历表的列并存储列名和数据类型。我想使用输入动态表名称。在尝试编译过程(未声明的变量等)时,我收到了大量不同的错误消息。我必须把我的基本结构弄错。这就是我到目前为止所做的:
CREATE OR REPLACE PROCEDURE DV
(
TABLENAME IN VARCHAR2
)
authid current_user
AS
sql_qx varchar2(5000);
curTab varchar2(5000);
curCol varchar2(5000);
curTyp varchar2(5000);
BEGIN
sql_qx := 'DECLARE CURSOR tblCur IS
SELECT table_name,
column_name,
data_type
FROM user_tab_columns
WHERE table_name = ''' || TABLENAME || '''';
execute immediate sql_qx;
IF NOT tblCur%ISOPEN THEN
OPEN tblCur;
END IF;
FETCH tblCur INTO curTab, curCol, curTyp;
WHILE tblCur%FOUND THEN
LOOP
dbms_output.put_line(tblCur.curTab || ' ' ||tblCur.curCol || ' ' ||tblCur.curTyp);
FETCH tblCur INTO curTab, curCol, curTyp;
END LOOP;
END DV;
答案 0 :(得分:0)
试试这个:
CREATE OR REPLACE PROCEDURE DV (TABLENAME IN VARCHAR2) authid current_user
AS
curTab varchar2(5000);
curCol varchar2(5000);
curTyp varchar2(5000);
CURSOR tblCur IS
SELECT table_name, column_name, data_type
FROM user_tab_columns
WHERE table_name = TABLENAME;
BEGIN
IF NOT tblCur%ISOPEN THEN
OPEN tblCur;
END IF;
LOOP
FETCH tblCur INTO curTab, curCol, curTyp;
EXIT WHEN tblCur%NOTFOUND;
dbms_output.put_line(curTab || ' ' || curCol || ' ' || curTyp);
END LOOP;
END DV;
你甚至不需要一个明确的光标:
CREATE OR REPLACE PROCEDURE DV (TABLENAME IN VARCHAR2) authid current_user
AS
BEGIN
FOR c IN (SELECT table_name, column_name, data_type
FROM user_tab_columns
WHERE table_name = TABLENAME)
LOOP
dbms_output.put_line(c.table_name || ' ' || c.column_name || ' ' || c.data_type);
END LOOP;
END DV;