00984. 00000 - "栏目不允许在这里"

时间:2015-01-30 11:46:39

标签: oracle plsql dynamic-sql

我正在尝试创建以下PL / sql但收到错误

创建新的匿名PL / SQL块:

  • 首先,从employees表中选择员工总数,平均工资,最高工资和最低工资为PL / SQL变量。平均工资应四舍五入为整数

  • 然后创建一个包含以下列的表统计信息:

    the_date   DATE,                                        
    emp_num NUMBER                              
    avg_sal   NUMBER                                    
    max_sal   NUMBER                                
    min_sal   NUMBER          
    
  • 然后使用上面提到的PL / SQL变量将今天的日期,员工总数,平均工资,最高工资和最低工资的值插入统计表中

  • 最后在屏幕上打印。

我的代码:

DECLARE
 v_emp_no Number;
 v_av_sal Number;
 v_mx_sal Number;
 v_mn_sal Number;
BEGIN
 SELECT count(employee_id) as total_emp, ROUND(AVG(salary))as avg_sal, MAX(salary)as max_sal, MIN(salary)as min_sal
 INTO v_emp_no, v_av_sal, v_mx_sal, v_mn_sal
 FROM employees;
 EXECUTE IMMEDIATE 'CREATE TABLE stats (the_date DATE, emp_num NUMBER, avg_sal NUMBER, max_sal NUMBER, min_sal NUMBER)';
 EXECUTE IMMEDIATE 'INSERT INTO stats values (sysdate, v_emp_no, v_av_sal, v_mx_sal, v_mn_sal)';
 EXECUTE IMMEDIATE 'DROP TABLE stats';
 DBMS_OUTPUT.PUT_LINE('Today our company has '||v_emp_no||' emplyees');
 DBMS_OUTPUT.PUT_LINE('The average salary in the company is '||v_av_sal);
 DBMS_OUTPUT.PUT_LINE('The maximum salary in the company is '||v_mx_sal);
 DBMS_OUTPUT.PUT_LINE('The minimum salary in the company is '||v_mn_sal);
END;
/

但得到以下错误

Error report -
ORA-00984: column not allowed here
ORA-06512: at line 11
00984. 00000 -  "column not allowed here"
*Cause:    
*Action:

2 个答案:

答案 0 :(得分:5)

在这一行:

EXECUTE IMMEDIATE 'INSERT INTO stats values (sysdate, v_emp_no, v_av_sal, v_mx_sal, v_mn_sal)';

变量名称不引用您的变量,但被视为列名。

您需要为此使用绑定变量:

EXECUTE IMMEDIATE 'INSERT INTO stats values (sysdate, :1, :2, :3, :4)'
  USING v_emp_no, v_av_sal, v_mx_sal, v_mn_sal;

答案 1 :(得分:0)

  

EXECUTE IMMEDIATE'INSERT INTO stats values(sysdate,v_emp_no,v_av_sal,v_mx_sal,v_mn_sal)';

这是错误的。因为v_emp_no, v_av_sal, v_mx_sal, v_mn_sal变量而不是。您需要将它们视为变量。

编辑

你不应该(ab)使用动态SQL来完成这些琐碎的任务。

退一步思考,是不是应该用普通的 SQL 而不是 PL / SQL 来完成?整个匿名块只是三个SQL语句 -

SQL> CREATE TABLE stats
  2    (
  3      the_date DATE,
  4      emp_num  NUMBER,
  5      avg_sal  NUMBER,
  6      max_sal  NUMBER,
  7      min_sal  NUMBER
  8    );

Table created.

SQL> INSERT INTO stats
  2  SELECT sysdate,
  3    COUNT(empno)    AS total_emp,
  4    ROUND(AVG(sal)) AS avg_sal,
  5    MAX(sal)        AS max_sal,
  6    MIN(sal)        AS min_sal
  7  FROM emp;

1 row created.

SQL> SELECT * FROM stats;

THE_DATE     EMP_NUM    AVG_SAL    MAX_SAL    MIN_SAL
--------- ---------- ---------- ---------- ----------
30-JAN-15         14       2073       5000        800

SQL>
SQL> DROP TABLE stats PURGE;

Table dropped.