Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle 98400000-“第;“此处不允许使用列”;_Oracle_Plsql_Dynamic Sql - Fatal编程技术网

Oracle 98400000-“第;“此处不允许使用列”;

Oracle 98400000-“第;“此处不允许使用列”;,oracle,plsql,dynamic-sql,Oracle,Plsql,Dynamic Sql,我试图创建以下PL/sql,但出现错误 Error report - ORA-00984: column not allowed here ORA-06512: at line 11 00984. 00000 - "column not allowed here" *Cause: *Action: 创建新的匿名PL/SQL块: 首先,从employees表中选择员工总数、他们的平均工资、他们的最高工资和最低工资作为PL/SQL变量。平均工资应四舍五入为整数 然后创建包含以下列的表s

我试图创建以下PL/sql,但出现错误

Error report -
ORA-00984: column not allowed here
ORA-06512: at line 11
00984. 00000 -  "column not allowed here"
*Cause:    
*Action:
创建新的匿名PL/SQL块:

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

  • 然后创建包含以下列的表stats:

    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:
在这方面:

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;
立即执行“插入统计值(系统日期、版本号、版本号、版本号、版本号、版本号、版本号)”

这是错误的。因为,
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.

当然是绑定变量而不是串联?是的,很好。我宁愿不使用PL/SQL,而是使用普通SQL。编辑了我的答案。我想这是一个练习;否则,为什么还要处理表呢?为什么不单独使用普通的
select
?无论哪种方式创建和删除表似乎。。。太过分了,我同意。然而,类似于表的统计数据并不总是被认为只是一个选择。在分析领域,对于创建BI仪表盘,类似于统计的表格是有意义的。当然,但不要创建它并立即删除它。谁知道OP的想法是什么(虽然*8-)为什么PL/SQL可以在普通SQL中实现同样的功能。