PDA

View Full Version : Tạo bảng tạm trong Store Procedure của Oracle???



thukhoa
17-05-2005, 07:52
Chào các bạn.
Tôi mới học Oracle chưa được bao lâu, theo tôi được biết thì trong Store Procedure của Oracle không hỗ trợ tạo bảng tạm như SQL Server. Vậy có cách nào khác để có thể thay thế tạo bảng tạm được không???
Xin giúp đỡ.

diendan86
17-05-2005, 08:42
Trên Oracle bạn có thể tạo bảng tạm (temporary table), là các kiểu table mà dữ liệu được tạo dùng riêng cho mỗi session. Các thuộc tính khác của nó y chang table thông thường, ví dụ bạn có thể chạy các lệnh DDL thông thường như ALTER, DROP, bạn có thể tạo TRIGGER trên nó. Giá trị sẽ bị flush khi kết thúc session hoặc một hành động commit, abort transaction tùy theo cách tạo table trong câu lệnh DDL của bạn.

Cú pháp như sau:
CREATE GLOBAL TEMPORARY TABLE tablename (fieldname FIELDTYPE LENGTH...) ON COMMIT actions ROWS;

Ex.

+ Tạo bảng tạm THUKHOA, dữ liệu sẽ bị xóa khi kết thúc transaction:
CREATE GLOBAL TEMPORARY TABLE THUKHOA
(
BRCD NUMBER,
BRNAME VARCHAR2(30)
) ON COMMIT DELETE ROWS;

+ Tạo bảng tạm THUKHOA, dữ liệu sẽ chỉ bị xóa khi kết thúc session:
CREATE GLOBAL TEMPORARY TABLE THUKHOA
(
BRCD NUMBER,
BRNAME VARCHAR2(30)
) ON COMMIT PRESERVE ROWS;

ALTER TABLE THUKHOA ADD CONSTRAINTS PK_THUKHOA PRIMARY KEY (BRCD);

Với các vấn đề mới nên đọc thấu đáo, làm rõ khái niệm. Tìm các thành phần tương đương với hệ thống khác, và try to think nó chạy thế nào... ---> PSM Use Case.

Have Fun,

thukhoa
17-05-2005, 08:57
Chào bạn diendan86
Cám ơn bạn đã reply.
Tôi đã viết store theo cách của bạn như sau:

CREATE OR REPLACE PROCEDURE TAO_BANG(
var_i in number
)
as
begin
CREATE GLOBAL TEMPORARY TABLE THUKHOA
(
BRCD NUMBER,
BRNAME VARCHAR2(30)
) ON COMMIT DELETE ROWS;

end;

Nhưng bị báo error như sau:
Line # = 6 Column # = 1 Error Text = PLS-00103: Encountered the symbol "CREATE" when expecting one of the following: begin case declare exit for goto if loop mod null pragma raise return select update while with <an identifier> <a double-quoted delimited-identifier> <a bind variable> << close current delete fetch lock insert open rollback savepoint set sql execute commit forall merge <a single-quoted SQL string> pipe

Đó là lỗi gì vậy bạn.
Xin bạn giúp đỡ tiếp.

phong_ld
17-05-2005, 09:53
Ối giời ơi, làm sao mà chạy trực tiếp câu lênh DDL trong store procedure được cơ chứ !!!!!!!!!!
Bạn phải dùng package DBMS_SQL để thực thi các câu lênh như vậy.
Hoặc đơn giản nhất là dùng câu lệnh Execute Immediate 'Your sql command here'

thukhoa
17-05-2005, 10:04
Chào các bạn,
Tôi đã viết lại như sau:

CREATE OR REPLACE PROCEDURE TAO_BANG(
var_i in number
)
as
str varchar2(200);
begin
str='CREATE GLOBAL TEMPORARY TABLE THUKHOA
(
BRCD NUMBER,
BRNAME VARCHAR2(30)
) ON COMMIT DELETE ROWS';
execute immediate str;
end;

Nhưng khi thực thi thì báo không có quyền tại dòng execute immediate str;
Như vậy mình phải làm sao??

diendan86
17-05-2005, 10:54
Function Exec_DDL(iSQL varchar2) Return varchar2
is
CurNo number;
RetN number;
begin
CurNo := dbms_sql.open_cursor;
dbms_sql.parse(CurNo,iSQL,dbms_sql.native);
RetN := dbms_Sql.execute(CurNo);
dbms_sql.close_cursor(CurNo);
return ('OK');
exception
when others then
if dbms_sql.is_open(curno) then
dbms_sql.close_cursor(CurNo);
end if;
Return (sqlerrm);
end;

Đừng đi chi tiết về câu lệnh vội, hãy học cách cấu trúc chương trình cho nó đàng hoàng theo kiểu (CLASS BASE) chẳng hạn, với các DDL thì thông thường là tạo các STATIC OBJECT và rất ít khi OVERRIDE, viết PL/SQL theo tôi là cần phân biệt trước OWNER "USER" (Like Database in SQL Server), PACKAGE... Với những người mới tiếp cận nên học methodology và cách organize.

::: Bạn cần học lại nghiêm túc phần (Architecture and Administration - Lession: Managing Priviledges, Lession: Managing Roles)

Chúc bạn thành công!