【问题标题】:Wrong number or types of arguments参数数量或类型错误
【发布时间】:2018-09-30 07:19:49
【问题描述】:
Create or replace procedure sp_create_tables as 
Lv_str varchar2(1000);
Begin
    For I in (select distinct(deptno) from emp) loop
    Lv_str:='create table deptno'||I||'  select * from emp where 
        1=2';
    Execute immediate lv_str;
    End loop;
End;

【问题讨论】:

  • 嗨,Prasanth,我看到你表现出了你的努力,但你需要清楚地解释你想要什么。
  • 请检查我的回答,如果它对您有帮助,请接受它或为给定的解决方案提供相关反馈(cmets)。请阅读:stackoverflow.com/help/someone-answers 了解为什么它很重要。

标签: sql oracle plsql dynamic-sql


【解决方案1】:

据我了解,您的问题可能是“为什么程序会抛出此编译错误”

PLS-00306:调用“||”时参数的数量或类型错误

原因是隐式游标循环变量I 指的是查询中的记录集,而不是deptno 本身。为了引用deptno,您应该使用<loop_variable>.deptno。您还应该更改另外两件事:缺少as 关键字,DISTINCT 是一个关键字,您将其用作函数,由于默认括号而有效,但不是正确的使用方式。

Create or replace procedure sp_create_tables as 
Lv_str varchar2(1000);
Begin
    For I in (select distinct dept from emp) loop
    Lv_str:='create table deptno'||I.deptno||' as select * from emp where 
        1=2';
    Execute immediate lv_str;
    End loop;
End;

【讨论】:

    【解决方案2】:

    在这行代码中I是一个隐含的rowtype变量,其数据结构由驱动select语句的投影定义:

    For I in (select distinct(deptno) from emp) loop
    

    但是您试图在动态 SQL 中引用它,就好像它是一个属性一样。您需要改用列名。

    Create or replace procedure sp_create_tables as 
       Lv_str varchar2(1000);
    Begin
        For I in (select distinct (deptno) from emp) loop
            Lv_str:='create table deptno'|| I.deptno ||
                  ' as  select * from emp where  1=2';
            Execute immediate lv_str;
        End loop;
    End;
    

    顺便说一句,您的动态 SQL 语句中有一个错误。正确的语法是CREATE TABLE ... AS SELECT ...。动态 SQL 很难,因为编译器无法验证字符串中的代码位。因此,应该是编译错误的内容表现为运行时错误。您会发现使用一些日志记录(或dbms_output.put_line())来检测您的代码以在汇编语句运行之前记录它会很有帮助。它使调试变得容易得多。


    “我收到一条错误消息,提示 -01031 权限不足”

    这意味着您创建表的授权是通过角色授予的。 Oracle 安全模型不允许我们使用通过角色授予的权限来构建 PL/SQL 程序或视图。这包括通过动态 SQL 执行 DDL 的 PL/SQL。您需要一个 DBA 用户直接将 CREATE TABLE 授予您的用户。

    【讨论】:

    • 这很有帮助,但我收到一条错误消息,提示 -01031 权限不足
    猜你喜欢
    • 1970-01-01
    • 2015-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-15
    相关资源
    最近更新 更多