0

自動列を持つテーブルを作成しようとしています。その値は、定義した関数を使用して計算されます。ただし、テーブルを作成しようとすると、ora-00907: 右括弧がありません。誰でも助けることができますか?

作成コードは次のとおりです。

CREATE TABLE NEW_EMP2 (
SSN CHAR(9), 
EMP_NUM2 CHAR(5) automatic as newemp2id(SSN), 
Fname VARCHAR2(15), 
Lname VARCHAR2(15), 
Bdate DATE
)

関数newemp2idのコードは次のとおりです。

CREATE OR REPLACE FUNCTION newemp2id (i_ssn NCHAR) RETURN NCHAR
IS
BEGIN
RETURN 'E'||(1000+SUBSTR(i_ssn,6,4));
END

これに関するヘルプは大歓迎です、ありがとう!

更新:違いが生じる場合に備えて、Windows VistaマシンでOracle Express Editionを使用しています。

4

3 に答える 3

3

これまで構文について聞いたことがありませんでしたが、見つけたのはOracleRDB用のこのPDFだけです。 RDBは、Oracleデータベース用の別個の製品でした...確認済み-10gではサポートされていません

代わりにBEFOREINSERTトリガーを使用してください。使用している構文がOracleExpress(10gで効果的)に有効であるとは思わないためです。CREATETABLEまたはALTERTABLEのドキュメントには記載がありません。

私はトリガーを使用するのが好きではありません。特定のテーブルに挿入するための単一のストアドプロシージャを用意し、テーブルに直接アクセスするのではなく、誰でもそのプロシージャを使用できるようにしたいのですが...

CREATE OR REPLACE TRIGGER newemp2_before_insert
BEFORE INSERT
    ON new_mep2
    FOR EACH ROW
BEGIN

    -- Update created_by field to the username of the person performing the INSERT
    :new.emp_num2 := newemp2id(new.ssn)
END;

率直に言って、ビューで処理できる場合、これは非常に複雑です。

CREATE VIEW vw_emp AS
  SELECT t.ssn,
         'E'||(1000+SUBSTR(i_ssn,6,4)) AS emp_num2
    FROM NEW_EMP2 t
于 2010-08-21T17:33:43.047 に答える
1

自動列とは何ですか? 純粋に計算された、つまり仮想列を意味していましたか? 次に、ステートメントは次のようになります。

CREATE TABLE NEW_EMP2 (
SSN CHAR(9), 
EMP_NUM2 CHAR(5) GENERATED ALWAYS AS ( newemp2id(SSN) ) VIRTUAL, 
Fname VARCHAR2(15), 
Lname VARCHAR2(15), 
Bdate DATE
)

そして、あなたの関数は決定論的に宣言する必要があります:

CREATE OR REPLACE FUNCTION newemp2id (i_ssn NCHAR) RETURN NCHAR DETERMINISTIC 
IS
BEGIN
RETURN 'E'||(1000+SUBSTR(i_ssn,6,4));
END

私が間違っていなければ、仮想列は Oracle 11g で導入されました。

于 2010-08-21T17:31:16.870 に答える
1

Oracle Express は Oracle 10g です。

マニュアル ( http://download-uk.oracle.com/docs/cd/B19306_01/server.102/b14200/statements_7002.htm#i2095331 ) によると、「automatic」キーワードはなく、Oracle 10 は「computed」をサポートしていません。列」

Oracle 11g は仮想列をサポートしていますが、それらは を使用して作成されてGENERATED ALWAYSおり、Oracle 11g でさえautomaticキーワードを持っていません。

なぜこれが Oracle で機能すると思いますか?

于 2010-08-21T17:31:48.617 に答える