使用PL / SQL中的列名连接输入参数

时间:2014-04-21 06:42:56

标签: sql oracle concatenation

我在Orcale有桌子。像:

ID  |  YEAR  |  Day1  |  Day2  |  Day3  |  Day4  |  Day5 ... to Day31
========================================================

我想更新特定日期。我有从日期算起的日期号码。但是我如何将日期编号连接到“Day”列,以便我获得特定日期的列。如果有任何其他方式可以帮助我。

谢谢, ByteBoy

3 个答案:

答案 0 :(得分:0)

这解决了您的问题:

CREATE TABLE day_table
(id NUMBER,
 year NUMBER,
 day1 NUMBER,
 day2 NUMBER,
 day3 NUMBER,
 day4 NUMBER,
 day5 NUMBER
);

INSERT INTO day_table VALUES(1, 2014, 1, 2, 3, 4, 5);

CREATE OR REPLACE PROCEDURE update_day(p_day_number NUMBER, p_day_value NUMBER) IS
  v_sql VARCHAR2(200);
BEGIN
  v_sql:='UPDATE day_table SET day'||p_day_number||'='||p_day_value;
  EXECUTE IMMEDIATE v_sql;
END;

BEGIN
 update_day(3, 666);
END;

答案 1 :(得分:0)

这是一个工作示例。

create table t1(
   datum date
  ,day1  number, day2  number, day3  number, day4  number, day5  number
  ,day6  number, day7  number, day8  number, day9  number, day10 number
  ,day11 number, day12 number, day13 number, day14 number, day15 number
  ,day16 number, day17 number, day18 number, day19 number, day20 number
  ,day21 number, day22 number, day23 number, day24 number, day25 number
  ,day26 number, day27 number, day28 number, day29 number, day30 number
  ,day31 number
  ,constraint t1_pk primary key(datum)
);

insert into t1(datum)
select date '2014-01-01' - 1 + level as datum
  from dual
  connect by level <= date '2014-12-31' - date '2014-01-01' + 1;

commit;

declare
   l_sql varchar2(1000) := null;
   l_col varchar2(80)   := null;
begin

   for r in (select datum from t1) loop
      l_col := 'day' || to_number(to_char(r.datum, 'DD'));

      l_sql := 'update t1 set ' || l_col || ' = 1 where datum = :d';
      execute immediate l_sql using r.datum;
   end loop;

   commit;
end;
/

答案 2 :(得分:0)

我在Code Behind文件中使用Datatable解决了这个问题。

非常感谢你的帮助。