1

以下は私のempテーブルの構造です:

Name                 Null?    Type
------------------ -------- ------------
EMP_ID             NOT NULL NUMBER
EMP_NAME                    VARCHAR2(20)
DEPT_ID                     NUMBER
AGE                         NUMBER
SEX                         VARCHAR2(5)

以下のRECORD TYPE定義を使用すると、機能します。

declare
type rec_emp is record(empid emp.emp_id%TYPE, empname emp.emp_name%type, empdept emp.dept_id%type, empage emp.age%type, empsex emp.sex%type);
v_emprecord rec_emp;
begin
v_emprecord.empid := 11;
v_emprecord.empname := 'Alen';
v_emprecord.empdept := 2;
v_emprecord.empage := 27;
v_emprecord.empsex := 'M';
update emp set ROW = v_emprecord where emp_id = 11;
dbms_output.put_line('Rows Updated: ' || sql%rowcount);
end;

しかし、繰り返しますが、このコードを試してみるとうまくいきません (ここでは、RECORD TYPE変数の列数を減らしました):

declare
type rec_emp is record(empname emp.emp_name%type, empdept emp.dept_id%type);
v_emprecord rec_emp;
begin
v_emprecord.empname := 'Alen';
v_emprecord.empdept := 2;
update emp set ROW = v_emprecord where emp_id = 11;
dbms_output.put_line('Rows Updated: ' || sql%rowcount);
end;

エラーは次のとおりです: PL/SQL: ORA-00913: 値が多すぎます

私の場合、すべての列をRECORDTYPE で宣言する必要はないため、宣言の列数を減らしてみましたRECORD TYPE。そのような行動の特定の理由はありますか?

4

2 に答える 2

3

ROWレコードを使用してキーワードを使用して pratial 行を更新することはできません。

ドキュメントから

PL/SQLレコード値によるデータベースの更新

UPDATE ステートメントの PL/SQL のみの拡張により、フィールドのリストではなく、SET 句の右側にある RECORD または %ROWTYPE 型の 1 つの変数を使用して、データベースの行を更新できます。

于 2013-06-16T11:02:32.927 に答える
2

Oracle は、レコード タイプから除外された列を認識できないため、レコード フィールドをマップするテーブル列も認識できません。

%typeレコード定義でを使用したため、解決できるはずだと考えるかもしれません。しかし、それはこれをより一般的な構造の特殊なケースにするだけです。varchar2や などの明示的な型、numberまたは などの異なるソース テーブルを使用することもできdept.dept_id%typeますが、すべての列が「マップ」される最初のインスタンスでも機能します。しかし、2 番目の場合、列とフィールドの関係を知ることは不可能です。

場合によっては、オラクルが意図したことを推測または推測する可能性がありますが、それは、より多くの作業を行う必要があり、さまざまな状況で異なる動作をすることを意味し、おそらくより重要なことに、それらの仮定に依存することは、それが終了することを意味する可能性があることを意味します意図したことを実際に実行していないため、コードにとって危険です。

本当にオプションを使用したい場合はROW、他のフィールドも宣言できますが、null または他のデフォルトを使用します。しかし、それは既存の列の値をデフォルト値で上書きします。これはおそらくあなたが望むものではありません. または、レコードに既存の値を選択します。それ以外の場合は、で列を個別に指定する必要がありますupdate。これはより正常です。update気になる2つの列を直接設定するだけでなく、ここでレコードを使用する理由がわかりません。

update emp
set empname = 'Alen', empdept = 2
where empid = 11;
于 2013-06-16T11:02:47.523 に答える