Skip to Main Content

SQL & PL/SQL

Announcement

For appeals, questions and feedback about Oracle Forums, please email oracle-forums-moderators_us@oracle.com. Technical questions should be asked in the appropriate category. Thank you!

Trying to Create tables

2fddb624-7170-40d0-8686-8962507bdc12Dec 16 2017 — edited Dec 16 2017

I'm trying to create these tables but for some reason the SC_CAR table gets an error saying "table or view doesn't exist". The other 2 table are perfectly fine to make and have no problems. I've remade them and tried to organize them in a different way but that doesn't work. Does anyone know what is wrong with the table?

create table SC_CAR(

CARSERIAL CHAR(8)

, CUSTNAME VARCHAR(20)

, make VARCHAR(10) NOT NULL

, model CHAR(2) NOT NULL

, caryear CHAR(4) NOT NULL

, extcolour VARCHAR(15)  NOT NULL

, trim VARCHAR(15) NOT NULL

, enginetype VARCHAR (10) NOT NULL

, baselistprice DECIMAL(10,2) NOT NULL

, PURCHINVNO CHAR(6)

, purchcost DECIMAL(10,2)

, CONSTRAINT pkcar PRIMARY KEY(CARSERIAL)

, CONSTRAINT fkcar1 FOREIGN KEY(CUSTNAME) REFERENCES SC_CUST(CUSTNAME)

, CONSTRAINT fkcar2 FOREIGN KEY(PURCHINVNO) REFERENCES SC_PURCHINV(PURCHINVNO));

create table SC_CUST(

CUSTNAME VARCHAR(20)

, custaddress VARCHAR(30) NOT NULL

, custcity VARCHAR(15) NOT NULL

, custprovince VARCHAR(10) NOT NULL

, custpostal CHAR(6) NOT NULL

, custhomephone CHAR(10) NOT NULL

, custworkphone CHAR(10)

, CONSTRAINT pkcust PRIMARY KEY(CUSTNAME));

create table SC_PURCHINV(

PURCHINVNO CHAR(6)

, purchasedfrom VARCHAR(20) NOT NULL

, purchdate DATE NOT NULL

, CONSTRAINT pkpurchinv PRIMARY KEY(PURCHINVNO));

Comments

tlokweng
Answer

クエリトランスフォーメーションのビューマージで2階層のクエリが1階層に置換され、結果として各行でプロシジャが2回づつ呼ばれているということですね。なので単純にプロシジャを呼んでいるインラインビューがマージされないようにすれば解決します。素直にNO_MERGEヒントでOKでしょう。テーブルサイズが大きくなければWITHにしてファクタリングするのもアリですね。

> create table test_table(n) as select 1 from dual union select 2 from dual;

> create function test_func return varchar2 as begin RETURN DBMS_RANDOM.STRING('x', 10); end;

> select n, r r1, r r2 from (select n, test_func r from test_table);

        N R1          R2

--------- ------------ ------------

        1 AJ1LNZ30HD  LAMQV4CQUY

        2 F911DGQDYZ  ID8FDREGKF

> select n, r r1, r r2 from (select /*+ no_merge */ n, test_func r from test_table);

--------- ------------ ------------

        1 K5MPMUR3DQ  K5MPMUR3DQ

        2 DD2Y5NUWPM  DD2Y5NUWPM

> with t as (select /*+ materialize */ n, test_func r from test_table) select n, r r1, r r2 from t;

--------- ------------ ------------

        1 0F2RE7Y8C3  0F2RE7Y8C3

        2 O6C4WCBAFP  O6C4WCBAFP

Marked as Answer by 988825 · Sep 27 2020
988825

tlokweng様、お礼が遅くなってしまい、申し訳ありません。サンプルまでお示しくださいまして、誠にありがとうございます。

クエリトランスフォーメーションがこのようなSQLに対し作用しているとは全く一度も想像すらつきませんでした。

頂戴したサンプルで動作も確認出来ましたので、本来の組み込み先に入れてみようと思います。

ありがとうございました。

1 - 2
Locked Post
New comments cannot be posted to this locked post.

Post Details

Locked on Jan 13 2018
Added on Dec 16 2017
3 comments
191 views