【发布时间】:2021-06-15 07:27:44
【问题描述】:
我是使用 Oracle 11g 的新手,在让参数化查询顺利运行时遇到了很多问题。
此代码有效:
Dim rs As ADODB.Recordset
Dim con As ADODB.Connection
Dim cmd As ADODB.Command
Dim prm As ADODB.Parameter
Set con = New ADODB.Connection
With con
.ConnectionString = GetConnection() '<-- the driver here is Driver={Oracle in OraClient11g_home1_32bit}
.Open
End With
Set cmd = New ADODB.Command
With cmd
Set .ActiveConnection = con
.CommandType = adCmdText
.CommandText = "SELECT * FROM MPA_LINEPLAN.REF_BRAND_SEASON_DROP WHERE DROP_ID = ?"
Set prm = .CreateParameter("dropID", adVarChar, adParamInput, 50, "P_SP19_5")
.Parameters.Append prm
Set rs = .Execute
End With
但我要运行的实际查询会多次引用 dropID 参数。为了让它工作,我必须一遍又一遍地添加相同的参数。告诉我有没有更好的方法?我尝试了以下方法:
With cmd
Set .ActiveConnection = con
.CommandType = adCmdText
.CommandText = "SELECT * FROM MPA_LINEPLAN.REF_BRAND_SEASON_DROP WHERE DROP_ID = :dropID"
Set prm = .CreateParameter("dropID", adVarChar, adParamInput, 50, "P_SP19_5")
.Parameters.Append prm
Set rs = .Execute
End With
但是当我尝试执行 rs 时,它会命中 unspecified error。
另外,假设对于我的特殊情况,存储过程不是最好的选择(即使它应该是最好的选择:-/)
编辑:
实际查询很长,为了不让您搜索所有 :dropID 引用,我在此处对其进行了缩减,但留出足够显示多个引用。
WITH
--...
DropDim AS (
SELECT DROP_ID
, DROP_NAME
, SEASON_ID
, SEASON_NAME
, BRAND_ID
, SEASON_YEAR
, 'DROP_' || substr(DROP_ID, LENGTH(DROP_ID),1) AS LP_Join_Drop
, SEASON_NAME || '_' || SEASON_YEAR AS LP_Join_Season
FROM MPA_LINEPLAN.REF_BRAND_SEASON_DROP
WHERE DROP_ID = :dropID),
--...
LYMap AS
(SELECT DC.DROP_ID
, DC.CHANNEL_ID
, BSD.SEASON_YEAR
, BSD.SEASON_NAME
, BSD.DROP_NAME
, FW.WEEKENDINGDATE AS LY_WEEKENDING_DATE
, FW.YEARWEEK AS LY_YEARWEEK
FROM MPA_LINEPLAN.REF_DROP_CHANNEL DC
INNER JOIN MPA_MASTER.FISCALWEEK FW
ON FW.YEARWEEK BETWEEN DC.LY_START_DT AND DC.LY_END_DT
INNER JOIN MPA_LINEPLAN.REF_BRAND_SEASON_DROP BSD ON BSD.DROP_ID = dc.DROP_ID
WHERE DC.DROP_ID = :dropID),
LLYMap AS
(SELECT DC.DROP_ID
, DC.CHANNEL_ID
, BSD.SEASON_YEAR
, BSD.SEASON_NAME
, BSD.DROP_NAME
, FW.WEEKENDINGDATE AS LLY_WEEKENDING_DATE
, FW.YEARWEEK AS LLY_YEARWEEK
FROM MPA_LINEPLAN.REF_DROP_CHANNEL DC
INNER JOIN MPA_MASTER.FISCALWEEK FW
ON FW.YEARWEEK BETWEEN DC.LLY_START_DT AND DC.LLY_END_DT
INNER JOIN MPA_LINEPLAN.REF_BRAND_SEASON_DROP BSD ON BSD.DROP_ID = dc.DROP_ID
WHERE DC.DROP_ID = :dropID ),
--....
【问题讨论】:
-
声明一个变量?
Set @foo = ?然后在脚本中使用@foo?关于 Oracle 的 IDK,但这可能是我在 SQL Server 上要做的。 -
@MathieuGuindon 这也是我的想法,但我没有尝试,因为 Oracle 等效项似乎有效。我得到了各种
not all variables bound错误。令人惊讶的是,我在互联网上找不到任何工作示例:-( -
我不理解问题。在哪里使用相同的参数一遍又一遍。为什么qmarks不起作用?在两个准备好的语句中,只使用一个参数。你的意思是一条 SQL 语句有多个 qmark 吗?
-
@Parfait 为简单起见,我只放了一个简单的sql语句。实际语句引用
dropID(或 qmark)变量 10 次以上。关键是我不想添加相同的参数 10+ 次以使 qmark 版本工作。 -
多次相同 SQL 查询?请显示实际的肯定不止一个
dropID参考。