我有一张桌子,我想创建它的副本。但我希望这个副本是动态的。第一张表可能会改变。在FOR LOOP中,对于每个i(1除外),我想改变第二个表并添加一个名为" Col" +" i"的列。示例:Col1,Col2,Col3。
在调试时,一切都没问题,除了这一行:EXECUTE IMMEDIATE 'ALTER TABLE '||tab_name||' ADD Col'||i||' NUMBER(2)';
抛出2个错误:" ORA-01403:没有找到数据"和" ORA-06512"
我究竟做错了什么?谢谢!
CREATE TABLE first_table (
id NUMBER(2,0) NOT NULL PRIMARY KEY,
col1 NUMBER(2,0) NOT NULL,
col2 NUMBER(2,0) NOT NULL,
col3 NUMBER(2,0) NOT NULL,
col4 NUMBER(2,0) NOT NULL,
col5 NUMBER(2,0) NOT NULL,
col6 NUMBER(2,0) NOT NULL,
col7 NUMBER(2,0) NOT NULL
);
CREATE TABLE second_table (
first_col NUMBER PRIMARY KEY
);
CREATE OR REPLACE PROCEDURE second_table
AS
nr_columns NUMBER(2);
tab_name VARCHAR2(20);
col_nam VARCHAR2(20) := 'COL';
BEGIN
SELECT COUNT (*)
INTO nr_columns
FROM user_tab_columns
WHERE table_name='FIRST_TABLE';
SELECT table_name
INTO tab_name
FROM user_tab_columns
WHERE column_name ='FIRST_COL';
FOR i IN 1..NR_COLUMNS
LOOP
IF (i=1) THEN
EXECUTE IMMEDIATE 'ALTER TABLE '||tab_name||' RENAME COLUMN FIRST_COL TO id';
ELSE
EXECUTE IMMEDIATE 'ALTER TABLE '||tab_name||' ADD Col'||i||' NUMBER(2)';
END IF;
END LOOP;
END;
/
答案 0 :(得分:3)
它非常适合我。
<强>表格强>
SQL> CREATE TABLE first_table (
2 id NUMBER(2,0) NOT NULL PRIMARY KEY,
3 col1 NUMBER(2,0) NOT NULL,
4 col2 NUMBER(2,0) NOT NULL,
5 col3 NUMBER(2,0) NOT NULL,
6 col4 NUMBER(2,0) NOT NULL,
7 col5 NUMBER(2,0) NOT NULL,
8 col6 NUMBER(2,0) NOT NULL,
9 col7 NUMBER(2,0) NOT NULL
10 );
Table created.
SQL>
SQL> CREATE TABLE second_table (
2 first_col NUMBER PRIMARY KEY
3 );
Table created.
SQL>
<强>程序强>
SQL> CREATE OR REPLACE PROCEDURE p_second_table
2 AS
3 nr_columns NUMBER(2);
4 tab_name VARCHAR2(20);
5 col_nam VARCHAR2(20) := 'COL';
6 BEGIN
7 SELECT COUNT (*)
8 INTO nr_columns
9 FROM user_tab_columns
10 WHERE table_name='FIRST_TABLE';
11
12 SELECT table_name
13 INTO tab_name
14 FROM user_tab_columns
15 WHERE column_name ='FIRST_COL';
16
17 FOR i IN 1..NR_COLUMNS
18 LOOP
19 IF (i=1) THEN
20 EXECUTE IMMEDIATE 'ALTER TABLE '||tab_name||' RENAME COLUMN FIRST_COL TO id';
21 dbms_output.put_line('if');
22 ELSE
23 EXECUTE IMMEDIATE 'ALTER TABLE '||tab_name||' ADD Col'||i||' NUMBER(2)';
24 dbms_output.put_line('else');
25 END IF;
26 END LOOP;
27 END;
28 /
Procedure created.
SQL>
SQL> sho err
No errors.
SQL>
我已添加 DBMS_OUTPUT ,以显示何时进入 IF-ELSE 阻止。
让我们测试,然后看看:
SQL> set serveroutput on
SQL> EXEC p_second_table;
if
else
else
else
else
else
else
else
PL/SQL procedure successfully completed.
让我们检查表格定义:
SQL> desc second_table;
Name Null? Type
----------------------------------------- -------- ---------
ID NOT NULL NUMBER
COL2 NUMBER(2)
COL3 NUMBER(2)
COL4 NUMBER(2)
COL5 NUMBER(2)
COL6 NUMBER(2)
COL7 NUMBER(2)
COL8 NUMBER(2)
SQL>
答案 1 :(得分:0)
您应该检查此查询
SELECT table_name
INTO tab_name
FROM user_tab_columns
WHERE column_name ='FIRST_COL';
异常ORA-01403: no data found
表示select没有返回一行。检查表second_table
是否存在,或者您是否已在另一个模式中创建它,现在可以在另一个模式中使用。同时在SECOND_TABLE.FIRST_COL
user_tab_columns
的名称