顯示具有 T - SQL 標籤的文章。 顯示所有文章
顯示具有 T - SQL 標籤的文章。 顯示所有文章

2009年9月8日

ORA-06550 , PLS-00306 ERROR

The error message :

ORA-06550: line 1, column 7: PLS-00306: wrong number or types of arguments in call to 'SP_GET_HRF001' ORA-06550: line 1, column 7: PL/SQL: Statement ignored


The .net source code :

OracleConnection sqlConnection = null;
try
{
sqlConnection = GetConnection(System.Configuration.ConfigurationSettings.AppSettings["OracleFbdConnectionString"]);
OracleParameter[] parameters = new OracleParameter[3];
parameters[0] = new OracleParameter("v_agent_id", OracleType.NVarChar);
parameters[0].Direction = ParameterDirection.Input;
parameters[0].Value = AgentID.ToString();
parameters[1] = new OracleParameter("v_idno", OracleType.NVarChar,15);
parameters[1].Direction = ParameterDirection.Output;
parameters[2] = new OracleParameter("v_name", OracleType.NVarChar,12);
parameters[2].Direction = ParameterDirection.Output;
OracleHelper.ExecuteNonQuery(sqlConnection, CommandType.StoredProcedure, "ERP.SP_GET_HRF001", parameters);
return parameters[1].Value.ToString();
}
catch (OracleException ex)
{
logger.Error("SP_GET_HRF001", ex);
throw ex;
}
catch (Exception ex)
{
logger.Error("SP_GET_HRF001", ex);
throw ex;
}
finally
{
if (sqlConnection != null)
{
sqlConnection.Close();
sqlConnection.Dispose();
}
}

The SP Code :

CREATE OR REPLACE PROCEDURE SP_GET_HRF001(v_agent_id IN VARCHAR2, id
v_idno OUT VARCHAR2,
v_name OUT VARCHAR2)
IS

BEGIN
BEGIN
SELECT id_no, chi_name
INTO v_idno, v_name
FROM hrf001
WHERE emp_no IN
(SELECT fbd_id
FROM mis_emp
WHERE emp_id = v_agent_id);
EXCEPTION
WHEN OTHERS THEN
NULL;
END;

END;


The solution :

You must to check the variable must the same name in the .net source code and sp code.



2007年11月3日

利用SQL驗證統一編號是否正確(台灣)

下面這一個SQL Function可以驗證公司的統一編號是否正確。




USE TTL_BPA_EAI
GO

IF EXISTS (SELECT * FROM sysobjects WHERE name = N'FN_CheckTaxID')
DROP FUNCTION FN_CheckTaxID
GO

CREATE FUNCTION FN_CheckTaxID
(
@TaxID NVARCHAR(50)
)RETURNS CHAR(1)
AS
BEGIN
--驗證統一編號是否正確
--@TaxID 欲驗證的統一編號
--如果驗證結果正確則回傳 '1' ELSE '0'
--2005/11/11 BRIAN

DECLARE @I INT

DECLARE @A1 INT
DECLARE @A2 INT
DECLARE @A3 INT
DECLARE @A4 INT
DECLARE @A5 INT

DECLARE @B1 INT
DECLARE @B2 INT
DECLARE @B3 INT
DECLARE @B4 INT
DECLARE @B5 INT

DECLARE @C1 INT
DECLARE @C2 INT
DECLARE @C3 INT
DECLARE @C4 INT

DECLARE @D1 INT
DECLARE @D2 INT
DECLARE @D3 INT
DECLARE @D4 INT
DECLARE @D5 INT
DECLARE @D6 INT
DECLARE @D7 INT
DECLARE @CD8 INT

--判斷長度
IF LEN(@TaxID) <> 8
RETURN '0'

--判斷字元
DECLARE @J INT
SET @J = 1
WHILE @J <= 8
BEGIN
IF CHARINDEX( SUBSTRING(@TaxID , @J , 1) , '0123456789') = 0
RETURN '0'
SET @J = @J + 1
END

--設定變數
SET @D1 = CAST(SUBSTRING(@TaxID , 1 , 1) AS INT)
SET @D2 = CAST(SUBSTRING(@TaxID , 2 , 1) AS INT)
SET @D3 = CAST(SUBSTRING(@TaxID , 3 , 1) AS INT)
SET @D4 = CAST(SUBSTRING(@TaxID , 4 , 1) AS INT)
SET @D5 = CAST(SUBSTRING(@TaxID , 5 , 1) AS INT)
SET @D6 = CAST(SUBSTRING(@TaxID , 6 , 1) AS INT)
SET @D7 = CAST(SUBSTRING(@TaxID , 7 , 1) AS INT)
SET @CD8 = CAST(SUBSTRING(@TaxID , 8 , 1) AS INT)

SET @C1 = @D1
SET @C2 = @D3
SET @C3 = @D5
SET @C4 = @CD8

SET @A1 = CAST(((@D2 * 2) / 10) AS INT )
SET @B1 = (@D2 * 2 ) % 10

SET @A2 = CAST(((@D4 * 2) / 10) AS INT )
SET @B2 = (@D4 * 2) % 10

SET @A3 = CAST(((@D6 * 2) / 10) AS INT )
SET @B3 = (@D6 * 2) % 10

SET @A4 = CAST(((@D7 * 4) / 10) AS INT )
SET @B4 = (@D7 * 4) % 10

SET @A5 = CAST(((@A4 + @B4) / 10) AS INT )
SET @B5 = (@A4 + @B4) % 10

--計算公式
IF (@A1 + @B1 + @C1 + @A2 + @B2 + @C2 + @A3 + @B3 + @C3 + @A4 + @B4 + @C4) % 10 = 0
RETURN '1'

IF @D7 = 7
BEGIN
IF (@A1 + @B1 + @C1 + @A2 + @B2 + @C2 + @A3 + @B3 + @C3 + @A5 + @C4 ) % 10 = 0
RETURN '1'
END

RETURN '0'
END
GO

-- =============================================
-- Example to execute function
-- =============================================
SELECT dbo.FN_CheckTaxID('01121111')
SELECT dbo.FN_CheckTaxID('22425662')

GO

利用SQL將某數值進行位數的補足

我們常常會為某些數值欄位做補值得動作,
例如33.23
要變成033.230等
下面這個SQL就是要做這件事情。


IF EXISTS (SELECT * FROM sysobjects WHERE name = N'FN_FILL_TEXT')
DROP FUNCTION FN_FILL_TEXT
GO

CREATE FUNCTION FN_FILL_TEXT
(
@STR VARCHAR(20) , --要被處理的字串
@CON INT , --要顯示的位數(包含小數點)
@DEC INT , --小數位數
@REPLACE CHAR(1) --要被補上的字元
)RETURNS VARCHAR(50)
AS
BEGIN
RETURN REPLACE( STR(@STR , @CON , @DEC) , ' ' , @REPLACE )
END
GO

SELECT dbo.FN_FILL_TEXT('39.1','8','3','0')
GO

--結果:0039.100

SQL Null的排序問題

排序對於資料顯示來說,是一個相當重要的一門課題,
這邊就稍微講解一下,如何讓一個DB的欄位值為NULL時,
可以排到最後面去


SELECT CURR_DEADLINE,SUBMIT_TIME , STATUS , *
FROM SWS_REQUEST_M A
ORDER BY
CASE
WHEN CURR_DEADLINE IS NULL THEN 1
ELSE 0
END
,CURR_DEADLINE


在ORDER BY的地方,先利用CASE的方式,將要排序的欄位,做第一次的篩選,
將該欄位如果為NULL的話,設定為1,這樣它在ORDER BY的時候,就會排比較後面,
接下來第二個ORDER欄位才是你真正要排序的欄位,
這樣一來將可以將該欄為如果為NULL的,排到最後面,
剩下不是NULL的再根據內容來進行排序一次。

2007年5月20日

測量您的SQL語法效能

你知道你寫出來的SQL語法跟他所寫出來的SQL語法誰的效能比較好嗎?
如果一個SQL語法的執行時間是以ms計算的話,
或許我們很難去評斷誰寫出來的效能比較高。

而下面這一個語法,將可以幫助我們來得知你的SQL到底要花費多少時間來執行它。
將有助於我們去改善自己的SQL效能


DECLARE @START DATETIME, @STOP DATETIMESET @START = GETDATE()

WAITFOR DELAY '00:00:00.080' -- 利用延遲語法來做延遲80 ms,在此區塊放置你所撰寫的SQL Script

SET @STOP = GETDATE()

SELECT 'The Execution took ' + CONVERT(varchar(10), DATEDIFF(ms, @START, @STOP)) + ' ms'