如何使用存储过程构建自动编号

时间:2014-09-19 03:23:31

标签: mysql sql stored-procedures

我在项目表中有这样的数据

Tabel siswa                          Tabel jurusan             Tabel Penjurusan
id_siswa nama nilai tes id_jurusan   id_jurusan id_fakultas  nama         id id_siswa id_jurusan option ket
1         A     6         01           01             04     Sipil       1    1        01         1    lULUS
2         B     7         02           02             04     Mesin       2    1        02         2    TIDAK LULUS    
3         C     8         01           03             09     Sastra      3    1        03         3    TIDAK LULUS
4         D     6         03                                             4    2        01         1    LULUS
5         E     7         02                                             5    2        02         2    TIDAK LULUS
                                                                         6    2        03         3    TIDAK LULUS

我想用这样的格式制作otomatis号码

  

year_kode fakultas_kode jurusan_nomor(yyffjj0000)

nomor是0001-9999之间的数字,按值max排序" Nilai tes"

和我这样的查询

    CREATE PROCEDURE kd_mahasiswa (kode int(10), tgl_daftar date, nama_jurusan varchar(225), nama_fakultas varchar(225))

BEGIN
  DECLARE kunci varchar(20);
  DECLARE urut  varchar(20);

  SET kunci = CONVERT(varchar,DATEPART(YEAR,@tgl_daftar)) '+'
                    UPPER(SUBSTRING(LTRIM(@nama_jurusan)) '+'
                UPPER(SUBSTRING(LTRIM(@nama_fakultas));

  SELECT urut = ISNULL(MAX(RIGHT(kode,4)),0) + 1 FROM siswa, penjurusan, jurusan, fakultas WHERE penjurusan.kode = siswa.kode
AND jurusan.id_jurusan = penjurusan.id_penjurusan AND fakultas.id_fakultas = jurusan.id_fakultas order by nilai_tes,uang_gedung DESC

  SET urut = RIGHT('000' + @urut,4);

  SET kunci = CONCAT(kunci,urut);

  INSERT INTO siswa VALUES(kunci,@tgl_daftar,@nama_jurusan, @nama_fakultas)
END

我尝试该查询但是程序错误

  #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '@kunci varchar(20)
  DECLARE @urut  varchar(20)

  SET @kunci = CONVERT(varch' at line 4 

我使用了Mysql ..

请帮我解决这个问题?

谢谢。

1 个答案:

答案 0 :(得分:0)

您不能DECLARE用户定义的变量,用户定义变量的名称以@字符开头。

过程变量名@字符开头。

如果要使用用户定义的变量,请删除DECLARE语句。如果要使用过程变量,请从变量引用中删除@字符。

请注意,过程中的语句需要以分号结束。并且+运算符是数字加法,而不是字符串连接。

例如:

    DECLARE kunci VARCHAR(20) ;
    SET urut = RIGHT(CONCAT('000',urut),4);
    SET kunci = CONCAT(kunci,urut);

过程变量,过程参数和列名之间可能存在名称冲突。 MySQL通过赋予过程变量优先于过程参数和列来解决这些冲突。

如果要将表达式的值分配给SELECT语句中的用户定义变量,则需要使用:=赋值运算符...

    SELECT @urut := expr 
                 ^^

要将SELECT的结果返回到过程变量,可以使用SELECT语句的SELECT ... INTO形式:

    SELECT expr INTO urut FROM ...
                ^^^^

(使用SELECT... INTO,如果查询返回多行,MySQL将抛出错误;您可以通过在末尾添加LIMIT 1子句来确保查询最多返回一行。 SELECT语句。