statement.go 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. // Statement.go
  2. package database
  3. import (
  4. "fmt"
  5. "bet24.com/log"
  6. )
  7. const (
  8. AdParamInput = iota
  9. AdParamOutput
  10. AdParamInputOutput
  11. )
  12. const (
  13. AdTinyInt = iota
  14. AdSmallInt
  15. AdInteger
  16. AdBigint
  17. AdChar
  18. AdVarChar
  19. AdBinary
  20. AdFloat
  21. AdNVarChar
  22. )
  23. type Parameter struct {
  24. IO int
  25. Name string
  26. Type int
  27. Data interface{}
  28. DataLen int
  29. }
  30. type Statement struct {
  31. Params []Parameter
  32. NeedReturnValue bool
  33. IsOpenRecordSet bool
  34. ProcName string
  35. }
  36. func NewStatement() *Statement {
  37. this := new(Statement)
  38. return this
  39. }
  40. func (this *Statement) AddParamter(name string, io, t int, dataLen int, value interface{}) {
  41. p := Parameter{io, name, t, value, dataLen}
  42. this.Params = append(this.Params, p)
  43. }
  44. func (this *Statement) SetProcName(name string) {
  45. this.ProcName = name
  46. }
  47. func (this *Statement) SetNeedReturnValue(b bool) {
  48. this.NeedReturnValue = b
  49. }
  50. func (this *Statement) SetOpenRecordSet(b bool) {
  51. this.IsOpenRecordSet = b
  52. }
  53. func (this *Statement) GenSql() string {
  54. if len(this.ProcName) == 0 {
  55. log.Error("Statement.GenSql faile no procname")
  56. return ""
  57. }
  58. if len(this.Params) == 0 {
  59. return fmt.Sprintf("exec %s", this.ProcName)
  60. }
  61. ret := "declare "
  62. if this.NeedReturnValue {
  63. ret = fmt.Sprintf("%v @RETURN_VALUE int", ret)
  64. if len(this.Params) > 0 {
  65. ret = fmt.Sprintf("%v; declare ", ret)
  66. }
  67. }
  68. // 声明所有参数
  69. for k, v := range this.Params {
  70. if k != 0 {
  71. ret = fmt.Sprintf("%v; declare ", ret)
  72. }
  73. switch v.Type {
  74. case AdTinyInt:
  75. ret = fmt.Sprintf("%v%s TINYINT; set %s=%v", ret, v.Name, v.Name, v.Data)
  76. case AdSmallInt:
  77. ret = fmt.Sprintf("%v%s SMALLINT; set %s=%v", ret, v.Name, v.Name, v.Data)
  78. case AdInteger:
  79. ret = fmt.Sprintf("%v%s INT; set %s=%v", ret, v.Name, v.Name, v.Data)
  80. case AdFloat:
  81. ret = fmt.Sprintf("%v%s DECIMAL(18, 4); set %s=%v", ret, v.Name, v.Name, v.Data)
  82. case AdBigint:
  83. ret = fmt.Sprintf("%v%s BIGINT; set %s=%v", ret, v.Name, v.Name, v.Data)
  84. case AdChar:
  85. ret = fmt.Sprintf("%v%s CHAR(%d); set %s='%v'", ret, v.Name, v.DataLen, v.Name, v.Data)
  86. case AdVarChar:
  87. ret = fmt.Sprintf("%v%s VARCHAR(%d); set %s='%v'", ret, v.Name, v.DataLen, v.Name, v.Data)
  88. case AdBinary:
  89. ret = fmt.Sprintf("%v%s VARBINARY(%d); set %s =0x%s", ret, v.Name, v.DataLen, v.Name, v.Data)
  90. case AdNVarChar:
  91. ret = fmt.Sprintf("%v%s NVARCHAR(%d); set %s=N'%v'", ret, v.Name, v.DataLen, v.Name, v.Data)
  92. }
  93. }
  94. // 声明结束
  95. ret = fmt.Sprintf("%v;", ret)
  96. if !this.NeedReturnValue {
  97. ret = fmt.Sprintf("%v exec %s ", ret, this.ProcName)
  98. } else {
  99. ret = fmt.Sprintf("%v exec @RETURN_VALUE = %s ", ret, this.ProcName)
  100. }
  101. // 执行参数
  102. comma := ""
  103. for _, v := range this.Params {
  104. if v.IO == AdParamOutput || v.IO == AdParamInputOutput {
  105. ret = fmt.Sprintf("%v%s%v OUTPUT", ret, comma, v.Name)
  106. } else {
  107. ret = fmt.Sprintf("%v%s%v", ret, comma, v.Name)
  108. }
  109. comma = ","
  110. }
  111. // 如果返回结果集
  112. /*if this.IsOpenRecordSet {
  113. return ret
  114. }*/
  115. outStr := ""
  116. comma = ""
  117. for _, v := range this.Params {
  118. if v.IO == AdParamOutput || v.IO == AdParamInputOutput {
  119. outStr = fmt.Sprintf("%v%s%s", outStr, comma, v.Name)
  120. comma = ","
  121. }
  122. }
  123. if this.NeedReturnValue || len(outStr) > 0 {
  124. ret = fmt.Sprintf("%v ;select ", ret)
  125. }
  126. if this.NeedReturnValue {
  127. ret = fmt.Sprintf("%v @RETURN_VALUE%s%s", ret, comma, outStr)
  128. } else {
  129. ret = fmt.Sprintf("%v%v", ret, outStr)
  130. }
  131. return ret
  132. }