立即执行 'alter table' 错误 pl/sql
Execute immediate 'alter table' error pl/sql
我有一个 table,我想创建它的副本。但我希望这个副本是动态的。首先 table 可能会改变。在 FOR 循环中,对于每个 i(1 除外),我想更改第二个 table 并添加一个名称为 "Col"+"i" 的列。示例:Col1、Col2、Col3。
调试时,一切正常,除了这一行:EXECUTE IMMEDIATE 'ALTER TABLE '||tab_name||' ADD Col'||i||' NUMBER(2)';
抛出 2 个错误:"ORA-01403: no data found" 和 "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;
/
它非常适合我。
表格
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.
让我们检查一下table定义:
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>
你应该检查这个查询
SELECT table_name
INTO tab_name
FROM user_tab_columns
WHERE column_name ='FIRST_COL';
异常 ORA-01403: no data found
表示 select 没有 return 行。检查 table second_table
是否存在,或者您可能已经在另一个模式中创建它并且现在可以在另一个模式中使用。还要检查 user_tab_columns
中的 coolumn SECOND_TABLE.FIRST_COL
的名称
我有一个 table,我想创建它的副本。但我希望这个副本是动态的。首先 table 可能会改变。在 FOR 循环中,对于每个 i(1 除外),我想更改第二个 table 并添加一个名称为 "Col"+"i" 的列。示例:Col1、Col2、Col3。
调试时,一切正常,除了这一行:EXECUTE IMMEDIATE 'ALTER TABLE '||tab_name||' ADD Col'||i||' NUMBER(2)';
抛出 2 个错误:"ORA-01403: no data found" 和 "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;
/
它非常适合我。
表格
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.
让我们检查一下table定义:
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>
你应该检查这个查询
SELECT table_name
INTO tab_name
FROM user_tab_columns
WHERE column_name ='FIRST_COL';
异常 ORA-01403: no data found
表示 select 没有 return 行。检查 table second_table
是否存在,或者您可能已经在另一个模式中创建它并且现在可以在另一个模式中使用。还要检查 user_tab_columns
SECOND_TABLE.FIRST_COL
的名称