【问题标题】:SQL Server query into OracleSQL Server 查询到 Oracle
【发布时间】:2016-06-21 09:51:21
【问题描述】:

我有一个如下所示的 SQl 服务器查询。

DECLARE @TYPE_ID NUMERIC;
DECLARE @ELCFIELD_ID_1 NUMERIC;
DECLARE @ELCFIELD_ID_2 NUMERIC;
DECLARE @ELCFIELD_ID_3 NUMERIC;
DECLARE @ELCFIELD_ID_4 NUMERIC;
DECLARE @ELCFIELD_ID_5 NUMERIC;
DECLARE @ELCCMT_CODE NUMERIC;

BEGIN


SELECT @TYPE_ID =
(SELECT  (MAX(COALESCE(TYPE_ID,0)) + 1) FROM HS_HR_ELC_TYPE); 

SELECT @ELCFIELD_ID_1 =
(SELECT  (MAX(COALESCE(ELCFIELD_ID,0)) + 1) FROM HS_HR_ELC_FIELD); 

SELECT @ELCFIELD_ID_2 =
(SELECT  (MAX(COALESCE(ELCFIELD_ID,0)) + 2) FROM HS_HR_ELC_FIELD);

SELECT @ELCFIELD_ID_3 =
(SELECT  (MAX(COALESCE(ELCFIELD_ID,0)) + 3) FROM HS_HR_ELC_FIELD); 

SELECT @ELCFIELD_ID_4 =
(SELECT  (MAX(COALESCE(ELCFIELD_ID,0)) + 4) FROM HS_HR_ELC_FIELD); 

SELECT @ELCFIELD_ID_5 =
(SELECT  (MAX(COALESCE(ELCFIELD_ID,0)) + 5) FROM HS_HR_ELC_FIELD); 

SELECT @ELCCMT_CODE =
(SELECT  (MAX(COALESCE(ELCCMT_CODE,0)) + 1) FROM HS_HR_ELC_COMMENT_DEF);

我希望它转换为 Oracle 查询以在 Toad 中运行。

到目前为止,我已经找到了一种方法。

DECLARE
 TYPE_ID NUMBER;
 ELCFIELD_ID_1 NUMBER;
 ELCFIELD_ID_2 NUMBER;
 ELCFIELD_ID_3 NUMBER;
 ELCFIELD_ID_4 NUMBER;
 ELCFIELD_ID_5 NUMBER;
 ELCCMT_CODE NUMBER;

BEGIN
 TYPE_ID := 5;
 ELCFIELD_ID_1 := 5;
 ELCFIELD_ID_2 := 5;
 ELCFIELD_ID_3 := 5;
 ELCFIELD_ID_4 := 5;
 ELCFIELD_ID_5 := 5;
 ELCCMT_CODE := 5;
 END;

但我仍然无法将查询分配给如下变量

SELECT @TYPE_ID =
(SELECT  (MAX(COALESCE(TYPE_ID,0)) + 1) FROM HS_HR_ELC_TYPE); 

请帮我做这件事。提前谢谢你。

【问题讨论】:

  • 您收到错误或有什么问题?
  • 您检查过文档吗?不难找到如何声明变量并从查询结果中为它们赋值。另请注意,您可以从 SELECT 查询中检索多个值。您可以使用单个 SELECT 从 HS_HR_ELC_FIELD 检索所有必需的值
  • @Thomas 我可以直接为变量赋值,但在从另一个查询赋值时遇到问题。
  • 这样做的目的是什么?你打算如何处理这些变量?我怀疑选择数字的最大值并将其加 1 的代码,因为当您让用户同时运行代码时,这是一个潜在的错误。更不用说您的代码效率低下-您为什么要从 HS_HR_ELC_FIELD 中找到 ELCFIELD_ID 列的最大值 5 次?您确定找到它一次,然后根据需要添加 1、2、3、4 或 5?除非你不能将一个变量添加到 sql server 中的另一个变量? (我觉得很难想象,tbh!)
  • 是的。你所说的是正确的。但我只需要将 SQL 脚本转换为 Oracle 脚本。所以我遵循相同的结构。

标签: sql-server oracle toad


【解决方案1】:

您必须使用INTO 子句,如下所示(未经测试):

SELECT  (MAX(COALESCE(TYPE_ID,0)) + 1)
INTO    TYPE_ID    
FROM    HS_HR_ELC_TYPE;

【讨论】:

  • 当我这样做时,我总是得到这个错误,......第 1 行 ORA-06550 错误:第 12 行,第 31 列:PL/SQL:ORA-00932:不一致的数据类型:预期CHAR 得到 NUMBER ORA-06550:第 12 行,第 1 列:PL/SQL:SQL 语句被忽略
  • @jayz 使用 to_char(MAX(COALESCE(TYPE_ID,0)) + 1)
  • Oracle 中 type_id 列的数据类型是什么?听起来它是一个 VARCHAR2 (或其他一些字符串数据类型),但你的 COALESCE 的第二个元素是一个数字。两种数据类型必须相同。
  • 是的。这就是问题所在。谢谢塞缪尔的帮助。
【解决方案2】:

试试这个:

SELECT @TYPE_ID = (MAX(COALESCE(TYPE_ID,0)) + 1) FROM HS_HR_ELC_TYPE

【讨论】:

    【解决方案3】:

    我找到了我正在寻找的答案。

    SELECT (MAX (COALESCE(TO_NUMBER (TYPE_ID,99),0)) + 1)
    INTO    TYPE_ID    
    FROM    HS_HR_ELC_TYPE;
    

    感谢@Samuel 的帮助。

    【讨论】:

      猜你喜欢
      • 2014-03-31
      • 2017-10-07
      • 1970-01-01
      • 1970-01-01
      • 2015-10-28
      • 2016-07-29
      • 1970-01-01
      • 2014-05-30
      • 1970-01-01
      相关资源
      最近更新 更多