2014年4月15日 星期二

T-SQL - Stored Procedure 回傳 Table 怎麼接?


一直以為回傳 Table 是 UDFs 的專利,
最近因為很不幸的接了一坨【屎】,又重拾 T-SQL 寫東西,
然後因為太久沒寫 T-SQL,又沒有資料可以看,
所以就感覺好像在寫 pseudo code 一般,
先避著眼睛寫,感覺先對了,先不管語法對不對的問題。

等到要把 pseudo code 包成 UDFs 的時候才發現.....
忘了 UDFs 不可以下 UPDATE 了 .....又中招了!
所以只好切一切,把 INSERT, UPDATE 包在 SP 裡面,
不過我還是要回傳 @資料表 啊!
不想再回實體資料表去查,這樣效能應該會比較差,<--非常心虛的說應該
雖然這邊應該是沒有在管的,不過個人是做口碑的.....<--口碑很重要,但是做死自己不應該
再又一陣亂寫的狀況下,居然也沒錯誤訊息!
很心虛的又測試了一下,發現好像真的可以這樣用,
特寫此篇以茲紀念~~~

簡單的說就是
1.宣告一個 @資料表 去接 SP 回傳的資料表。
2.@資料表的 Schema 要跟 SP 回傳的資料表一模模一樣樣。
3.用 INSERT INTO @資料表 EXEC 的方式去呼叫 SP。
4.SP 回傳的可以直接用 SELECT 出來就可以。

--1+2
DECLARE @TMP_LIST TABLE (
   order_dt DATETIME,
   product_name NVARCHAR(20));

--3 重點是這個
INSERT INTO @TMP_LIST
EXEC SP_GET_TMP_LIST @set_dt , @user_id;

--4
CREATE PROC SP_GET_TMP_LIST
   @set_dt DATETIME,
   @user_id NVARCHAR(20)
AS
   SELECT order_dt, product_name FROM ORD 
      WHERE SET_DT = @set_dt AND USER_ID = @user_id;
GO

就這樣~

btw 為什麼一堆人聽不懂 schema ?到底......

2014年4月14日 星期一

Oracle - Tablespace 空間不足

今天打開資料庫查一個 table 的時候發現沒資料?
重新用 plsql 再倒還是沒資料?
看了一下錯誤訊息是

ORA-01658: 無法建立表格空間 (TABLESPACE NAME) 中區段的 INITIAL 擴充區塊

應該是 TABLESPACE 空間不夠的關係,

用下面這個 SQL 查一下目前 TABLESPACE ,

SELECT A.TABLESPACE_NAME, A.BYTES / 1024 / 1024 "Sum MB",
       (A.BYTES - B.BYTES) / 1024 / 1024 "used MB", B.BYTES / 1024 / 1024 "free MB",
       ROUND(((A.BYTES - B.BYTES) / A.BYTES) * 100, 2) "percent_used"
FROM (SELECT TABLESPACE_NAME, SUM(BYTES) BYTES
       FROM DBA_DATA_FILES
       GROUP BY TABLESPACE_NAME) A,
     (SELECT TABLESPACE_NAME, SUM(BYTES) BYTES, MAX(BYTES) LARGEST
       FROM DBA_FREE_SPACE
       GROUP BY TABLESPACE_NAME) B
WHERE A.TABLESPACE_NAME = B.TABLESPACE_NAME
ORDER BY ((A.BYTES - B.BYTES) / A.BYTES) DESC

果然有一個滿了!

用下面這個 SQL 可以查到資料庫的實體檔案,

SELECT FILE_ID, FILE_NAME, TABLESPACE_NAME, AUTOEXTENSIBLE, INCREMENT_BY
FROM DBA_DATA_FILES
ORDER BY FILE_ID DESC;

查到之後,就可以用下面的語法去增加檔案的大小。

ALTER DATABASE  
DATAFILE 'C:\APP\FRANKIE\ORADATA\XXXXXXXX.DBF'  
RESIZE 400M;

調整一下 RESIZE 後面的數字就可以了,就這樣~~~