簡體   English   中英

錯誤的參數數量或類型

[英]Wrong number or types of arguments

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;

這行代碼中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 程序或視圖。 這包括 PL/SQL 通過動態 SQL 執行 DDL。 您需要一個 DBA 用戶直接將 CREATE TABLE 授予您的用戶。

據我了解,您的問題可能是“為什么程序會引發此編譯錯誤”

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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM